2010-08-30 15 views
6

A menos que esté loco if None not in x y if not None in x son equivalentes. ¿Hay una versión preferida? Supongo que None not in es más inglés-y, por lo tanto, más pitónico, pero not None in se parece más a la sintaxis de otro idioma. ¿Hay una versión preferida?"Ninguno no en" vs "no Ninguno en"

+2

Vea también http://stackoverflow.com/questions/2710940 – Gumbo

+0

Si cambia de 1 operador a otro operador, muchas de las preguntas en SO serían duplicados – Falmarri

Respuesta

14

Recopilan en el mismo bytecode, por lo que sí son equivalentes.

>>> import dis 
>>> dis.dis(lambda: None not in x) 
    1   0 LOAD_CONST    0 (None) 
       3 LOAD_GLOBAL    1 (x) 
       6 COMPARE_OP    7 (not in) 
       9 RETURN_VALUE 
>>> dis.dis(lambda: not None in x) 
    1   0 LOAD_CONST    0 (None) 
       3 LOAD_GLOBAL    1 (x) 
       6 COMPARE_OP    7 (not in) 
       9 RETURN_VALUE 

El documentation también deja claro que los dos son equivalentes:

x not in s devuelve la negación de x in s.

Como mencionas None not in x es el inglés más natural, así que prefiero usar esto.

Si escribe not y in x podría no estar claro si se refería a not (y in x) o (not y) in x. No hay ambigüedad si usa not in.

+0

gracias, no sabía que podía comparar el bytecode como esta. –

7

La expresión

not (None in x) 

(parens añade para mayor claridad) es una negación boolean ordinario. Sin embargo,

None not in x 

se añade una sintaxis especial para el código más legible (no hay posibilidad aquí, ni tiene sentido, utilizar y, o, etc frente a la in). Si este caso especial fue agregado, úselo.

Lo mismo se aplica a

foo is not None 

vs

not foo is None 

encuentro el "no es" mucho más fáciles de interpretar. Como una ventaja adicional, si la expresión es parte de una expresión booleana más grande, el alcance de la no es inmediatamente claro.

+0

+1 por mencionar alcance – Falmarri