cpython - процессор:когда вызывается PyDict_GetItem и когда dict_subscript?
-
20-09-2019 - |
Вопрос
Я читаю код cpython для 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
вместо этого ;-)
Возможно, вы можете сделать эквивалент уровня C для my_getitem = getattr(my_dict, '__getitem__')
один раз, тогда назовите это.
Возможно, вы могли бы сообщить об ошибке или спросить на comp.lang.python