Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
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).