数学上,binary relation≤是二元关系union,而二元关系≥是二元关系>和=的并集。那么,为什么有一个原因使得Python默认不以__le__
和__lt__
来实现__eq__
,而没有以__ge__
和__gt__
的方式实现__eq__
?
默认的实现可能是这样的(但可能是出于C的考虑,例如__ne__
:]
def __le__(self, other): result_1 = self.__lt__(other) result_2 = self.__eq__(other) if result_1 is not NotImplemented and result_2 is not NotImplemented: return result_1 or result_2 return NotImplemented def __ge__(self, other): result_1 = self.__gt__(other) result_2 = self.__eq__(other) if result_1 is not NotImplemented and result_2 is not NotImplemented: return result_1 or result_2 return NotImplemented
这将使用户不必始终实现这两种方法。
这里是Python documentation(强调我的部分)中的相关段落:
—这些联合关系始终有效,而以下关系仅对total orders有效(也称为连接顺序),因此默认情况下不实现:complement≥ ,>是≤的补数。当用户使用Python标准库提供的默认情况下,
__ne__()
委托给__eq__()
并求反除非是NotImplemented
。没有其他暗示比较运算符之间的关系,例如,真相(x<y or x==y)
的值并不表示x<=y
。Note。
functools.total_ordering
类修饰器有效时,可以方便地实现这些互补关系。[其他关系始终有效并且已经在Python中默认实现
:≠是=的补码,=是其自身的functools.total_ordering
,≠是其自身的反面,是彼此的反面,和≤和≥彼此相反。因此,排除工会关系似乎是任意的。数学上,二元关系≤是二元关系和=的并集。因此,Python这样做有原因吗?
为什么要做出这个决定,只有原始作者知道,但是从手动得出的这些提示可以推断出原因:
一个例子是通过比较运算符表达时间点。例如,__bool__
仿真框架(免责声明:我维护此程序包)定义了<=
。我们可以使用比较来描述某个时间点“或之后”: