python total_ordering:为什么__lt__和__eq__而不是__le__?

Gui*_*tre 11 python comparison-operators python-3.x

在Python3中,functools.total_ordering装饰器允许只重载__lt____eq__获得所有6个比较运算符.

我不明白为什么一个人必须写两个运算符就足够了,即__le__或者__ge__,并且所有其他运算符都会相应地定义:

a < b   <=>   not (b <= a)
a > b   <=>   not (a <= b)
a == b   <=>   (a <= b) and (b <= a)
a != b   <=>   (a <= b) xor (b <= a)
Run Code Online (Sandbox Code Playgroud)

那是因为xor运算符本身不存在吗?

Mar*_*ers 16

该文件指出,你必须定义之一__lt__(),__le__(),__gt__(),或__ge__(),但只应该提供一个__eq__()方法.

换句话说,该__eq__方法是可选的.

total_ordering执行不要求你指定的__eq__方法; 它仅测试为__lt__(),__le__(),__gt__(),或__ge__()方法.它提供了多达3种缺失的特殊方法,基于其中之一.

__eq__方法是可选的,因为基础object对象为您定义了一个; 只有当两个实例是同一个对象时才被视为相等; ob1 == ob2只有当ob1 is ob2True.看do_richcompare()功能object.c ; 记住==代码中的运算符有比较指针.