何时调用C tp_as_mapping(等)方法?

时间:2013-02-09 10:05:27

标签: python python-c-api python-extensions

C PyObject结构包含字段tp_as_numbertp_as_sequencetp_as_mapping。在哪些情况下调用这些?任何人都可以提供一些示例Python代码,这些代码会导致调用这些C方法吗?

1 个答案:

答案 0 :(得分:3)

这些方法相当于python的special methods,并且在相同的情况下被调用。例如,在执行tp_as_number->nb_add时调用a + ba是扩展类型。 它相当于__add__inplace_*函数是__i*__方法的等价物。

请注意,__r*__方法只是简单地将参数交换为普通函数,因此5 + a其中a是扩展类型将首先尝试调用{{1的数字版本在此失败后,它会尝试nb_add nb_add a作为第一个参数,5作为第二个参数。

atp_as_mapping结构也是如此。 tp_as_sequencemp_length函数由内置函数sq_length调用,相当于len。从理论上讲,你可以为__len__mp_length实现不同的功能,在这种情况下sq_length具有优先权(这可以从源代码中看出,即使我不知道这种行为是否存在记录在案。)

另请注意,例如,sq_length运算符可以在不同的函数中实现。尝试+后会调用sq_concat,因此扩展类型可以支持nb_add运算符而无需设置+函数。