Skip to content

[C API] Deprecate calling PyObject_SetAttr(obj, attr, NULL) with an exception set #135075

Closed

Description

@vstinner

The issue gh-106572 changed PyObject_DelAttr() and PyObject_DelAttrString() implementation from a macro to a function (commit 1f2921b).

Now I propose deprecating calls PyObject_SetAttr(obj, attr, NULL) and PyObject_SetAttrString(obj, attr, NULL) with an exception set to help detecting bugs. When the code creating the attribute value failed, it should be handled before calling PyObject_SetAttr[String)() to avoid deleting the attribute by mistake.

The change affects also the stable ABI.

I also propose to treat this deprecation as an error in Python 3.17.

Example of buggy code:

PyObject *module = PyUnicode_FromString(module_name);
int res = PyObject_SetAttrString(ns, "__module__", module);
Py_DECREF(module);

Correct code:

PyObject *module = PyUnicode_FromString(module_name);
if (module == NULL) { // <=== CHECK VALUE ===
    goto error;
}
int res = PyObject_SetAttrString(ns, "__module__", module);
Py_DECREF(module);

Linked PRs

Activity

  1. added a commit that references this issue on Jun 3, 2025
  2. vstinner commented on Jun 3, 2025

    @vstinner
    MemberAuthor

    It seems like currently, it's not really possible to call PyObject_SetAttr() with NULL and an exception set. For example, if type->tp_setattro is PyObject_GenericSetAttr(), it fails with an assertion error:

    python: Objects/typeobject.c:6080: _PyType_LookupStackRefAndVersion: Assertion `!PyErr_Occurred()' failed.
    
  3. vstinner commented on Jun 3, 2025

    @vstinner
    MemberAuthor

    Maybe we should directly treat this case (calling PyObject_SetAttr() with NULL value and an exception set) as an error, rather than trying to emit a DeprecationWarning.

  4. added
    type-featureA feature request or enhancement
    interpreter-core(Objects, Python, Grammar, and Parser dirs)
    on Jun 7, 2025
  5. added 2 commits that reference this issue on Jul 1, 2025
  6. added a commit that references this issue on Jul 11, 2025
  7. added a commit that references this issue on Jul 12, 2025
  8. added a commit that references this issue on Jul 13, 2025
  9. added a commit that references this issue on Aug 4, 2025
  10. added a commit that references this issue on Aug 19, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions