以下比较关系(=、≠、<、>、≤ 和 ≥)之间的数学关系始终有效,因此在 Python 中默认实现(除了 2 个联合关系,这似乎是任意的,这也是本文的原因):
- 2互补关系:“=和≠互为互补”;
- 6个逆向关系*:“=是自身的逆向关系”、“≠是自身的逆向关系”、“<和>是彼此的逆向关系”、“≤和≥是彼此的逆向关系”;
- 2个并集关系:“≤是<和=的并集,”≥是>和=的并集。
以下比较关系之间的关系仅对总订单functools.total_ordering
有效,因此在 Python 中默认不实现(但用户可以通过 Python 标准库提供的类装饰器方便地实现它们):
- 4种互补关系:“<和≥互为补”,">和≤互为补”。
为什么Python只缺少上面的2个联合关系(“≤是联合<和=”,“≥是>和=”的联合)?
它应该提供一个__le__
关于and 的默认实现,以及一个关于__lt__
and的默认实现,就像这些(但可能在 C 中为了性能,比如):__eq__
__ge__
__gt__
__eq__
__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
2 个联合关系始终有效,因此这些默认实现将使用户不必一直提供它们(如这里)。
这是Python 文档的段落,其中明确指出默认情况下当前未实现 2 个联合关系(粗体强调我的):
默认情况下,
__ne__()
委托__eq__()
并反转结果,除非它是NotImplemented
. 比较运算符之间没有其他隐含关系,例如,真值(x<y or x==y)
不隐含x<=y
。
* 逆向关系通过NotImplemented
协议在 Python 中实现。