Domanda interessante!
Ecco il bytecode da 'a' in 'abc' is True
:
>>> import dis
>>> dis.disassemble((lambda: 'a' in 'abc' is True).func_code)
2 0 LOAD_CONST 1 ('a') # stack: 'a'
3 LOAD_CONST 2 ('abc') # stack: 'a' 'abc'
6 DUP_TOP # stack: 'a' 'abc' 'abc'
7 ROT_THREE # stack: 'abc' 'a' 'abc'
8 COMPARE_OP 6 (in) # stack: 'abc' True
11 JUMP_IF_FALSE_OR_POP 21 # stack: 'abc'
14 LOAD_GLOBAL 0 (True) # stack: 'abc' True
17 COMPARE_OP 8 (is) # stack: False
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
e confrontarlo con quello di ('a' in 'abc') is True
:
>>> import dis
>>> dis.disassemble((lambda: ('a' in 'abc') is True).func_code)
1 0 LOAD_CONST 1 ('a') # stack: 'a'
3 LOAD_CONST 2 ('abc') # stack: 'a' 'abc'
6 COMPARE_OP 6 (in) # stack: True
9 LOAD_GLOBAL 0 (True)
12 COMPARE_OP 8 (is)
15 RETURN_VALUE
Così sembra che l'espressione 'a' in 'abc' is True
valuta come più o meno:
>>> 'a' in 'abc' and 'abc' is True
E ' sembra che questo sia il risultato del concatenamento dell'operatore: https://stackoverflow.com/a/19751586/71522 - la stessa magia che fa funzionare 1 < 5 < 10
correttamente.
Molto interessante!
(Nota: questo è stato fatto con CPython 2.7.2)
fonte
2013-11-14 21:38:24
Sei * * concatenamento degli operatori. –