Python为什么不提供默认的__le__和__ge__实现?

问题描述 投票:-1回答:2

数学上,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(强调我的部分)中的相关段落:

默认情况下,__ne__()委托给__eq__()并求反除非是NotImplemented。没有其他暗示比较运算符之间的关系,例如,真相(x<y or x==y)的值并不表示x<=y

Note。

—这些联合关系始终有效,而以下关系仅对total orders有效(也称为连接顺序),因此默认情况下不实现:complement≥ ,>是≤的补数。当用户使用Python标准库提供的functools.total_ordering类修饰器有效时,可以方便地实现这些互补关系。

[其他关系始终有效并且已经在Python中默认实现

:≠是=的补码,=是其自身的functools.total_ordering,≠是其自身的反面,是彼此的反面,和≤和≥彼此相反。因此,排除工会关系似乎是任意的。

数学上,二元关系≤是二元关系和=的并集。因此,Python这样做有原因吗?

python relationship comparison-operators
2个回答
3
投票

为什么要做出这个决定,只有原始作者知道,但是从手动得出的这些提示可以推断出原因:


2
投票

一个例子是通过比较运算符表达时间点。例如,__bool__仿真框架(免责声明:我维护此程序包)定义了<=。我们可以使用比较来描述某个时间点“或之后”:

© www.soinside.com 2019 - 2024. All rights reserved.