一个朋友引起了我的注意,在我指出一个奇怪的地方后,我们都感到困惑。
比如说Python的文档,并且至少从2.5.1开始就已经说过了(没有进一步检查:
可以任意链接比较,例如x<y<=z等于x<y和y<=z、 除了y只计算一次(但在这两种情况下,当发现x<y为false时,z根本不计算)。
我们的困惑在于“y只被评估一次”的含义。
class Magic(object):
def __init__(self, name, val):
self.name = name
self.val = val
def __lt__(self, other):
print("Magic: Called lt on {0}".format(self.name))
if self.val < other.val:
return True
else:
return False
def __le__(self, other):
print("Magic: Called le on {0}".format(self.name))
if self.val <= other.val:
return True
else:
return False
我们可以得出这样的结果:
>>> x = Magic("x", 0)
>>> y = Magic("y", 5)
>>> z = Magic("z", 10)
>>>
>>> if x < y <= z:
... print ("More magic.")
...
Magic: Called lt on x
Magic: Called le on y
More magic.
>>>
这当然
就像“y”一样,在传统意义上是“评估”两次——当
x.__lt__(y)
调用并对其执行比较,并且在
y.__le__(z)
考虑到这一点,Python文档说“y只计算一次”的确切含义是什么?