为什么’;Python提供了uuu le_uuuuu和uuu ge_uuuuu的默认实现?
比较关系(=)之间的以下数学关系,≠, ≤ 和≥) 始终有效,因此在Python中默认实现(2个联合关系除外,这似乎是任意的,也是本文的原因):为什么’;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关系:“和≤ 是相辅相成的” 为
- 2关系:“=和≠ 是相辅相成的”
- 6关系*:“=是其本身的反义词”≠ 是自身的相反“,“<和>是彼此的相反”,和”≤ 和≥ 是彼此的相反”
- 2.关系:≤ 工会是否
和=“”的并集
- 4关系:“<和≥ 是相互补充的“和”>和≤ 是相辅相成的”
\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
暗示