C PyObject结构包含字段tp_as_number
,tp_as_sequence
和tp_as_mapping
。在哪些情况下调用这些?任何人都可以提供一些示例Python代码,这些代码会导致调用这些C方法吗?
答案 0 :(得分:3)
这些方法相当于python的special methods,并且在相同的情况下被调用。例如,在执行tp_as_number->nb_add
时调用a + b
,a
是扩展类型。
它相当于__add__
。 inplace_*
函数是__i*__
方法的等价物。
请注意,__r*__
方法只是简单地将参数交换为普通函数,因此5 + a
其中a
是扩展类型将首先尝试调用{{1的数字版本在此失败后,它会尝试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
运算符而无需设置+
函数。