Open
Description
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);