要为我的CPython扩展类型实现!=和==,我应该实现tp_compare
,tp_richcompare
还是两者兼而有之?
在什么情况下他们每个人都被召唤?
答案 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
函数要求您始终使用昂贵的算法才能返回-1
,0
或1
。 tp_richcompare
函数OTOH告诉您预期的比较,因此您可以选择昂贵或廉价的算法,具体取决于手头的需求。
tp_richcompare
的另一个好处是,您可以针对无意义的操作引发例外,例如u < v
其中u
和v
是空间中的点