Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Description
PyObject_GetItem()
raises a KeyError if the key is not found in a mapping. In some cases it should be treated as any other error, but in other cases it should be caught and suppressed. The repeating pattern ofPyObject_GetItem()
followed byPyErr_ExceptionMatches(PyExc_KeyError)
andPyErr_Clear()
occurs 7 times inPython/bytecodes.c
and at least 5 times in other files.
I propose to add private helper_PyMapping_LookupItem()
which combines these three calls to make the code clearer. It also has a special case for exact dict, so eliminates even more repeating code. For example:
PyObject *m;- if (PyDict_CheckExact(modules)) {- m = Py_XNewRef(PyDict_GetItemWithError(modules, name));- }- else {- m = PyObject_GetItem(modules, name);- if (_PyErr_ExceptionMatches(tstate, PyExc_KeyError)) {- _PyErr_Clear(tstate);- }- }- if (_PyErr_Occurred(tstate)) {+ if (_PyMapping_LookupItem(modules, name, &m) < 0) { return NULL; }
The interface of_PyMapping_LookupItem()
is very similar to other private helper_PyObject_LookupAttr()
(see#76752) and to a proposed new C API for PyDict (see#106004).