要为我的 CPython 扩展类型实现 != 和 == ,我应该实现tp_compare
,tp_richcompare
还是两者都实现?
在什么情况下分别调用它们?
tp_richcompare
类似于Python语言本身丰富的比较特殊方法。它优先于tp_compare
在类上调用比较运算符时选择。
tp_richcompare
当您想要更好地控制比较逻辑时使用。例如,可能有一种非常便宜的方法来确定相等性,但不是优先级。Saymemcmp(a, b, sizeof(*a)) == 0
表示两个非常复杂的数据结构相等,但memcmp(a, b, sizeof(*a)) < 0
不表示a
小于b
,而是需要昂贵的算法来确定。该tp_compare
函数将要求您始终使用昂贵的算法来返回a-1
或. OTOH 函数告诉您要进行哪种比较,因此您可以根据手头的需要选择昂贵或便宜的算法。0
1
tp_richcompare
的另一个优点tp_richcompare
是您可以为没有意义的操作引发异常,例如空间中的u < v
位置u
和v
是点。