Что означает «оценивается только один раз» для цепных сравнений в Python?

Мой друг обратил на это мое внимание, и после того, как я указал на странность, мы оба запутались.

Скажем, документы Python, начиная с версии 2.5.1 (не проверяли дальше:

Сравнения могут быть связаны произвольно, например, x <y <= z эквивалентно x <y и y <= z, за исключением того, что y вычисляется только один раз (но в обоих случаях z вообще не оценивается, когда найдено x <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.
>>> 

Это уж точновыглядит как «у» в традиционном смысле «оценивается» дважды - один раз,x.__lt__(y) вызывается и выполняет сравнение на нем, и один раз, когдаy.__le__(z) называется.

Итак, с учетом этого, что именно означают документы Python, когда они говорят, что «y оценивается только один раз»?

Ответы на вопрос(2)

Ваш ответ на вопрос