Вот разборка:
>>> from dis import dis
>>> def foo():
... a = ['a', 'b', 'c']
... if 'b' in a:
... print "Found it!"
...
>>> dis(foo)
2 0 LOAD_CONST 1 ('a')
3 LOAD_CONST 2 ('b')
6 LOAD_CONST 3 ('c')
9 BUILD_LIST 3
12 STORE_FAST 0 (a)
3 15 LOAD_CONST 2 ('b')
18 LOAD_FAST 0 (a)
21 COMPARE_OP 6 (in)
24 POP_JUMP_IF_FALSE 35
4 27 LOAD_CONST 4 ('Found it!')
30 PRINT_ITEM
31 PRINT_NEWLINE
32 JUMP_FORWARD 0 (to 35)
>> 35 LOAD_CONST 0 (None)
38 RETURN_VALUE
Внутриоператор вызывает __contains__ в инструкции COMPARE_OP.Вы можете увидеть это в действии здесь:
class X(object):
def __init__(self, elements):
self.elements = elements
def __contains__(self, element):
print "Called __contains__"
return element in self.elements
x = X(['a', 'b', 'c'])
if 'b' in x:
print "Found it!"
Вы получите этот вывод:
...
>>> x = X(['a', 'b', 'c'])
>>> if 'b' in x:
... print "Found it!"
...
Called __contains__
Found it!