为什么’;Python提供了uuu le_uuuuu和uuu ge_uuuuu的默认实现?

为什么’;Python提供了uuu le_uuuuu和uuu ge_uuuuu的默认实现?,python,relationship,comparison-operators,partial-ordering,Python,Relationship,Comparison Operators,Partial Ordering,比较关系(=)之间的以下数学关系,≠, ≤ 和≥) 始终有效,因此在Python中默认实现(2个联合关系除外,这似乎是任意的,也是本文的原因): 2关系:“=和≠ 是相辅相成的” 6关系*:“=是其本身的反义词”≠ 是自身的相反“,“是彼此的相反”,和”≤ 和≥ 是彼此的相反” 2.关系:≤ 工会是否和=“”的并集 以下比较关系之间的关系仅对有效,因此在Python中默认情况下不实现(但用户可以在Python标准库提供的类装饰器有效时方便地实现它们): 4关系:“和≤ 是相辅相成的” 为

比较关系(=)之间的以下数学关系,≠, ≤ 和≥) 始终有效,因此在Python中默认实现(2个联合关系除外,这似乎是任意的,也是本文的原因):

  • 2关系:“=和≠ 是相辅相成的”
  • 6关系*:“=是其本身的反义词”≠ 是自身的相反“,“<和>是彼此的相反”,和”≤ 和≥ 是彼此的相反”
  • 2.关系:≤ 工会是否和=“”的并集
以下比较关系之间的关系仅对有效,因此在Python中默认情况下不实现(但用户可以在Python标准库提供的类装饰器有效时方便地实现它们):

  • 4关系:“<和≥ 是相互补充的“和”>和≤ 是相辅相成的”
为什么Python只缺少上面的两个联合关系(“≤ 工会是否和=“”)的联合?

它应该在
\uu lt\uuuu
\uuuu eq\uuuu
方面提供
\uuu le\uuuuu
的默认实现,以及在
\uu gt\uuuu
\uu eq\uuuu
方面提供
\uuuu ge\uuuuuu>的默认实现,类似于这些(但在性能方面可能是在C中,类似于
\uu ne\uuuuuuu>代码):

def\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
结果\u 1=自身。\u lt\u(其他)
结果\u 2=自身。\u等式\u(其他)
如果结果_1未执行,结果_2未执行:
返回结果_1或结果_2
返回未执行
定义(自身、其他):
结果_1=自身(其他)
结果\u 2=自身。\u等式\u(其他)
如果结果_1未执行,结果_2未执行:
返回结果_1或结果_2
返回未执行
2个联合关系始终有效,因此这些默认实现将使用户无需一直提供它们(如)

以下是一段明确指出2个联盟关系目前未默认实施(粗体强调):

默认情况下,
\uuu ne\uuu()
委托给
\uu eq\uu()
,并反转结果 除非
未实施
。否则没有其他隐含的 比较运算符之间的关系,例如,真值
关于
(x为什么做出这个决定,只有原作者知道,但根据这些手动提示,可以推断出原因:

要从单个根操作自动生成排序操作,请参阅

虽然此装饰器使创建行为良好的完全有序类型变得容易,但其代价是派生比较方法的执行速度较慢,堆栈跟踪更复杂。如果性能基准测试表明这是给定应用程序的瓶颈,那么改为实现所有六种富比较方法可能会这是一个简单的速度提升

将此与Python的“显式优于隐式”口号相结合,以下推理应该是令人满意的:


\uuuu eq\uuu
导出
\uu ne\uuuuu
几乎是免费的,它只是操作
而不是o.\uuu eq\uuuu(其他)
,即反转布尔值

然而,从
\uu lt\uuu
\uuu eq\uuuu
的联合中派生
\uu le\uuuuu
意味着需要调用这两种方法,如果所做的比较足够复杂,这可能会对性能造成巨大的影响,尤其是与优化的单个
\uu le\uuuuu
实现相比。
Python让您通过使用
total_ordering
decorator,您可以显式地选择这种方便而不是性能,但它不会隐式地影响您


如果您试图进行未实现的比较,而不是隐式派生的比较,则可能会出现显式错误,而隐式派生的比较没有实现,并且可能会产生微妙的错误,这取决于您打算对自定义类执行的操作。Python不会在这里为您做任何猜测,而是让您显式地进行比较实现所需的比较,或再次明确选择派生比较。

TLDR:不要求比较运算符返回
bool
。这意味着结果可能不会严格遵守“
a或==
”将是错误的。因此,
usim.time
定义了
=
=
,而不是
,以避免错误。自动定义比较运算符可以防止这种情况发生,或者错误地定义了运算符。

您的问题基于许多不正确的假设。您的问题开始于:

比较关系(
=
)始终有效,因此默认情况下在Python中实现(2个联合关系除外,这似乎是任意的,这也是本文的原因)

也没有默认的
实现。也没有默认的
实现,所以
也不能有默认的实现*

这在以下表达式参考文档中有所介绍:

相等比较的默认行为(
=
!=
)基于对象的身份。因此,具有相同身份的实例的平等性比较导致平等,而具有不同身份的实例的平等性比较导致不平等。这种默认行为的动机是希望所有对象都是自反的(即
x是y
暗示