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
The issue gh-106572 changed
PyObject_DelAttr()andPyObject_DelAttrString()implementation from a macro to a function (commit 1f2921b).Now I propose deprecating calls
PyObject_SetAttr(obj, attr, NULL)andPyObject_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 callingPyObject_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:
Correct code:
Linked PRs