在数学上,binary relation≤是二元关系union,而二元关系≥是二元关系>和=的并集。那么,为什么有一个原因导致Python默认不以__le__
和__lt__
来实现__eq__
,而没有以__ge__
和__gt__
的方式实现__eq__
?
默认实现是这样的:
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(强调我的部分)中的相关段落:
默认情况下,
__ne__()
委托给__eq__()
并求反除非是NotImplemented
。没有其他暗示比较运算符之间的关系,例如,真相(x<y or x==y)
的值并不表示x<=y
。
数学上,二元关系≤是二元关系和=的并集。因此,Python这样做有原因吗?
为什么要做出这个决定,只有原始作者知道,但是从手动得出的这些提示可以推断出原因:
一个例子是通过比较运算符表达时间点。例如,automatic __bool__
is not applicable in every case仿真框架(免责声明:我维护此程序包)定义了__bool__
。例如,我们可以使用比较来描述某个时间点“或之后”: