2016-07-10 27 views
6

Recentemente ho scoperto che le seguenti dichiarazioni: TrueDove nei documenti python consente l'operatore `in` per essere incatenato?

'a' in 'ab' in 'abc' 

Sono a conoscenza del confronto pitone concatenamento come a < b < c, ma non riesco a vedere nulla nella documentazione su questo essere legale.

Si tratta di una funzione accidentale nell'implementazione di CPython o è specificato questo comportamento?

risposta

8

Questo è un comportamento completamente specificato, non una funzione accidentale. concatenamento operatore è definito nel Comparison operators section:

confronti possono essere concatenati arbitrariamente, ad esempio, x < y <= z è equivalente a x < y and y <= z, tranne che y viene valutata solo una volta (ma in entrambi i casi z non viene valutato affatto quando x < y è trovato essere falso).

in è uno degli operatori di confronto; dalla stessa sezione:

comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!=" 
        | "is" ["not"] | ["not"] "in" 

non sono previste eccezioni per le combinazioni che potrebbero non ha molto senso.

L'espressione specifica utilizzata come esempio viene quindi eseguita come 'a' in 'ab' and 'ab' in 'abc', con il valore letterale 'ab' solo eseguito (caricato) una volta.

+0

Stavo guardando la sezione [confronti] (https://docs.python.org/3/library/stdtypes.html#comparisons) su una pagina diversa, che non elenca 'in' – Eric

+1

@Eric vedere il fondo di quella sezione: * Altre due operazioni con la stessa priorità sintattica, 'in' e' not in', sono supportate solo dai tipi di sequenza (sotto). * A causa di questa limitazione non sono elencati nella tabella. –

Problemi correlati