【发布时间】:2013-02-09 10:05:26
【问题描述】:
C PyObject 结构包含字段tp_as_number、tp_as_sequence 和tp_as_mapping。在什么情况下会调用这些?任何人都可以提供一些示例 Python 代码来调用这些 C 方法吗?
【问题讨论】:
标签: python python-c-api python-extensions
C PyObject 结构包含字段tp_as_number、tp_as_sequence 和tp_as_mapping。在什么情况下会调用这些?任何人都可以提供一些示例 Python 代码来调用这些 C 方法吗?
【问题讨论】:
标签: python python-c-api python-extensions
这些方法相当于 python 的special methods,并且在相同的情况下被调用。例如tp_as_number->nb_add在执行a + b时被调用,a是扩展类型。
它相当于__add__。 inplace_* 函数等效于 __i*__ 方法。
注意__r*__ 方法的实现只是简单地将参数交换到普通函数,因此5 + a 其中a 是扩展类型将首先尝试调用nb_add 的数字版本,在此失败后它会尝试nb_add of 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 函数。