You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[C API] Deprecate calling PyObject_SetAttr(obj, attr, NULL) with an exception set #135075
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);
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:
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.
Activity
pythongh-135075: Deprecate PyObject_SetAttr(obj, name, NULL) with exc
vstinner commentedon Jun 3, 2025
It seems like currently, it's not really possible to call PyObject_SetAttr() with NULL and an exception set. For example, if
type->tp_setattroisPyObject_GenericSetAttr(), it fails with an assertion error:vstinner commentedon Jun 3, 2025
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.pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…
gh-135075: Make PyObject_SetAttr() fail with NULL value and exception (…
pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…
pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…
pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…
pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…
pythongh-135075: Make PyObject_SetAttr() fail with NULL value and exc…