8

Pythonで多重比較構文をオーバーロードできるかどうか疑問に思っています:

a < b < c

単一の比較をオーバーロードできることは知っていますが、これらをオーバーロードすることは可能ですか?

4

1 に答える 1

14

内部的には として扱われるため、、 などa < b and b < cだけをオーバーロードする必要があります。__lt____gt__

ドキュメントから:

x < y <= z は、x < y および y <= z と同等ですが、y が 1 回だけ評価される点が異なります (ただし、どちらの場合も、x < y が false であることが判明した場合、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 に答える