Структура C PyObject содержит поля tp_as_number
, tp_as_sequence
и tp_as_mapping
. В каких обстоятельствах они вызываются? Может ли кто-нибудь предоставить некоторый пример кода Python, который приведет к вызову этих методов C?Когда используются методы C tp_as_mapping (et al.)?
ответ
Эти методы эквивалентны special methods python и вызывают в тех же обстоятельствах. Например, вызывается tp_as_number->nb_add
при выполнении a + b
и a
- тип расширения. Это эквивалент __add__
. Функции inplace_*
являются эквивалентами методов __i*__
.
Обратите внимание, что __r*__
метод реализованы просто свапирование аргументов нормальных функций, таким образом, 5 + a
где a
является тип расширения сначала попытается вызвать цифровую версию nb_add
, после того, как это не удалось его пытается nb_add
из a
положить 5
в качестве первого аргумент и a
как второй.
То же самое верно для tp_as_mapping
и tp_as_sequence
структур. Функции mp_length
и sq_length
вызываются встроенной функцией len
и эквивалентны __len__
. Теоретически вы можете реализовать разные функции для mp_length
и sq_length
, и в этом случае приоритет sq_length
(это видно из исходного кода, хотя я не знаю, документировано ли это поведение).
Также обратите внимание, что, например, оператор +
может быть реализован в различных функциях. sq_concat
вызывается после попытки nb_add
, и, таким образом, тип расширения может поддерживать оператор +
без наличия набора функций nb_add
.
Большое спасибо. Был бы признателен, если бы вы могли указать мне на какой-нибудь дополнительный документ, если есть ... – isedev
@isedev. Вы можете найти документацию [здесь] (http://docs.python.org/2/c-api/objimpl.html). Вы также можете найти некоторую информацию в [учебнике] (http://docs.python.org/2/extending/newtypes.html#abstract-protocol-support) – Bakuriu