Я читаю cpython code для python 3k, и я заметил, что __missing__
вызывается только при вызове dict_subscript
, но не при использовании PyDict_GetItem
. В чем разница между этими двумя методами и когда каждый называется? Если я передаю PyObject, который является подклассом dict и имеет метод __missing__
, как я могу заставить его использовать, так как PyDict_GetItem
не делает этого.
Наблюдения, догадки и т.д.:
То же самое происходит в Python 2.x.
dict_subscript
реализует эквивалент метода high_level dict.__getitem__
и поэтому будет вызываться всякий раз, когда adict[somekey]
появляется иначе, чем на LHS присваивания в коде Python.
PyDict_GetItem
является частью C API. Возможно, это недосмотр, что он не обновлен.
Прочитав ужасные комментарии в начале PyDict_GetItem
, я бы использовал PyDict_GetItemWithError
вместо: -)
Возможно, вы можете выполнить эквивалент уровня my_getitem = getattr(my_dict, '__getitem__')
на уровне C один раз, затем вызвать это.
Возможно, вы могли бы поднять билет с ошибкой или спросить на comp.lang.python