Pythonで多重比較構文をオーバーロードできるかどうか疑問に思っています:
a < b < c
単一の比較をオーバーロードできることは知っていますが、これらをオーバーロードすることは可能ですか?
Pythonで多重比較構文をオーバーロードできるかどうか疑問に思っています:
a < b < c
単一の比較をオーバーロードできることは知っていますが、これらをオーバーロードすることは可能ですか?
内部的には として扱われるため、、 など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