抛出这个问题(在Python 2.7.5中)有一点错字:
def foo(): return 3
if foo > 8:
launch_the_nukes()
Run Code Online (Sandbox Code Playgroud)
当它,我不小心爆炸了月亮.
我的理解是,E > F
相当于(E).__gt__(F)
和表现良好的类(如内置)相当于(F).__lt__(E)
.
如果没有__lt__
或__gt__
运营商那么我认为Python使用__cmp__
.
但是,这些方法都与工作function
对象,而<
与>
运营商做的工作.引擎盖下发生了什么?
>>> foo > 9e9
True
>>> (foo).__gt__(9e9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__gt__'
>>> (9e9).__lt__(foo)
NotImplemented
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 13
但是,当<和>运算符工作时,这些方法都不适用于函数对象.引擎盖下发生了什么?
在默认的任何其他合理比较中,2.x系列中的CPython基于类型名称进行比较.(这被记录为实现细节,尽管有一些有趣的例外情况只能在源代码中找到.)在3.x系列中,这将导致异常.
Python规范对2.x中的行为设置了一些特定的约束; 按类型名称进行比较不是唯一允许的行为,其他实现可能会执行其他操作.这不是一件值得信赖的事情.