Add PyMapping_GetOptionalItem() · Issue #106307 · python/cpython (original) (raw)
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 of PyObject_GetItem()
followed by PyErr_ExceptionMatches(PyExc_KeyError)
and PyErr_Clear()
occurs 7 times in Python/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).