扩展模块中的可比类型

时间:2010-05-19 13:40:49

标签: python cpython

要为我的CPython扩展类型实现!=和==,我应该实现tp_comparetp_richcompare还是两者兼而有之?

在什么情况下他们每个人都被召唤?

1 个答案:

答案 0 :(得分:6)

tp_richcompare类似于Python语言本身的丰富比较special methods。在类上调用比较运算符时,优先选择tp_compare

当您想要更好地控制比较逻辑时,请使用tp_richcompare。例如,可能有一种非常便宜的方法来确定平等,但不是优先级。说memcmp(a, b, sizeof(*a)) == 0表示两个非常复杂的数据结构相同,但memcmp(a, b, sizeof(*a)) < 0并不表示a小于b,而是需要一个昂贵的算法来确定。 tp_compare函数要求您始终使用昂贵的算法才能返回-101tp_richcompare函数OTOH告诉您预期的比较,因此您可以选择昂贵或廉价的算法,具体取决于手头的需求。

tp_richcompare的另一个好处是,您可以针对无意义的操作引发例外,例如u < v其中uv是空间中的点