8

我想知道是否可以在 python 中重载多重比较语法:

a < b < c

我知道可以重载单个比较,是否可以重载这些比较?

4

1 回答 1

14

在内部它被处理为a < b and b < c,所以你只需要重载__lt__,__gt__等等。

文档

x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当 x < y 被发现为假时,z 根本不计算)。

>>> import dis
>>> dis.dis(lambda : a < b < c)
  1           0 LOAD_GLOBAL              0 (a)
              3 LOAD_GLOBAL              1 (b)
              6 DUP_TOP             
              7 ROT_THREE           
              8 COMPARE_OP               0 (<)
             11 JUMP_IF_FALSE_OR_POP    21
             14 LOAD_GLOBAL              2 (c)
             17 COMPARE_OP               0 (<)
             20 RETURN_VALUE        
        >>   21 ROT_TWO             
             22 POP_TOP             
             23 RETURN_VALUE  

演示:

class A(object):
    def __lt__(self, other):
        print 'inside lt'
        return True
    def __gt__(self, other):
        print 'inside gt'
        return True
...        
>>> a = A()
>>> 10 < a < 20
inside gt
inside lt
True
于 2013-06-19T17:54:51.910 回答