扩展模块中的可比类型

Jam*_*kin 3 python cpython

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

在什么情况下他们都被称为?

Mar*_*tos 6

tp_richcompare类似于Python语言本身的丰富的比较特殊方法.它的选择优先tp_compare于在类上调用比较运算符的时间.

使用tp_richcompare当你想在比较逻辑更精细的控制.例如,可能有一种非常便宜的方法来确定平等,但不是优先级.Say memcmp(a, b, sizeof(*a)) == 0表示两个非常复杂的数据结构相等,但memcmp(a, b, sizeof(*a)) < 0并不表示a小于b,这需要一个昂贵的算法来确定.该tp_compare功能将要求你总是使用昂贵的算法,以返回一个-1,01.该tp_richcompare功能,OTOH,告诉你哪个比较打算,所以你可以选择昂贵或廉价的算法,根据手头的需要.

另一个优点tp_richcompare是,您可以为无意义的操作引发异常,例如空间中的u < v位置uv位置.

  • 并且为了补充这个答案,`tp_compare`在Python 3.x中消失了,所以`tp_richcompare`更加面向未来,如果你关心它的话. (2认同)