Skip to content

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

Open
@vstinner

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions