2013-06-19 4 views
8
それはPythonで多重比較構文をオーバーロードすることが可能です場合

私は思ったんだけど:複数の比較構文をPythonでオーバーロードすることは可能ですか?

a < b < c 

私はそれが単一の比較をオーバーロードすることが可能です知っている、それはこれらをオーバーロードすることは可能でしょうか?もしdocsからのみ__lt____gt__、等

をオーバーロードする必要があるので、

答えて

14

内部的には、a < b and b < cとして扱われる:

X < < = Zは、x < Yに相当し、y及びy < = zただし、yが の場合は1回だけ評価されます(ただし、どちらの場合も、 x < yが偽であると評価されます)。

>>> 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 
関連する問題