cpython: когда вызывается PyDict_GetItem и когда dict_subscript? - PullRequest
1 голос
/ 18 марта 2010

Я читаю код cpython для Python 3k, и я заметил, что __missing__ вызывается только при вызове dict_subscript, но не при использовании PyDict_GetItem. В чем разница между этими двумя методами и когда каждый из них вызывается? Если я передаю PyObject, который является подклассом dict и имеет метод __missing__, как я могу принудительно использовать его, поскольку PyDict_GetItem этого не делает.

1 Ответ

1 голос
/ 19 марта 2010

Наблюдения, догадки и т. Д .:

То же самое происходит в 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

...