【问题标题】:When are the C tp_as_mapping (et al.) methods invoked?何时调用 C tp_as_mapping (et al.) 方法?
【发布时间】:2013-02-09 10:05:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    tp_as_mappingtp_as_sequence 结构也是如此。 mp_lengthsq_length 函数由内置函数len 调用,等效于__len__。理论上你可以为mp_lengthsq_length实现不同的功能,在这种情况下sq_length具有优先权(这可以从源代码中看出,尽管我不知道这种行为是否被记录)。

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

    【讨论】:

    • 非常感谢。如果您能指出我进一步的文档,如果有的话,将不胜感激......
    • @isedev 你可以找到一些文档here。您还可以在tutorial中找到一些信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多