Pregunta Python `si x no es None` o` if not x is None`?


Siempre he pensado en el if not x is None versión para ser más claro, pero Google guía de estilo y PEP-8 ambos usan if x is not None. ¿Hay alguna diferencia de rendimiento menor (supongo que no), y hay algún caso en el que realmente no encaja (convirtiendo al otro en un ganador claro para mi convención)? *

* Me refiero a cualquier singleton, en lugar de solo None.

... para comparar singletons como   Ninguna. El uso es o no es


514
2018-04-26 03:10


origen


Respuestas:


No hay diferencia de rendimiento, ya que compilan en el mismo bytecode:

Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
...    return x is not None
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> def g(x):
...   return not x is None
...
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

Estilísticamente, trato de evitar not x is y. Aunque el compilador siempre lo tratará como not (x is y), un lector humano puede malinterpretar la construcción como (not x) is y. Si escribo x is not y entonces no hay ambigüedad.


780
2018-04-26 03:55



Tanto Google como PitónLa guía de estilo es la mejor práctica:

if x is not None:
    # Do something about x

Utilizando not x puede causar resultados no deseados Vea abajo:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

Puede que le interese ver qué literales se evalúan para True o False en Python:

Editar para comentarios a continuación: 

Acabo de hacer algunas pruebas más. not x es Ninguno no niega x primero y luego se compara con None. De hecho, parece que is el operador tiene una precedencia más alta cuando se usa de esta manera:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

Por lo tanto, not x is None es justo, en mi honesta opinión, lo mejor es evitarlo.

Más editar:

Lo acabo de hacer Más prueba y puede confirmar que el comentario de bukzor es correcto. (Al menos, no pude demostrarlo de otra manera)

Esto significa if x is not None tiene el resultado exacto como if not x is None. Estoy corregido. Gracias Bukzor.

Sin embargo, mi respuesta sigue en pie: Use el convencional if x is not None. :]


117
2018-04-26 03:13



El código debe escribirse para que sea comprensible para el programador primero, y el compilador o intérprete en segundo lugar. El constructo "no es" se parece más al inglés que a "no es".


112
2018-04-26 03:15



La respuesta es más simple de lo que las personas lo hacen.

No hay ninguna ventaja técnica de ninguna manera, y "x no es y" es lo que todos los demás usan, lo que lo convierte en el claro ganador. No importa si "se parece más al inglés" o no; todos lo usan, lo que significa que cada usuario de Python, incluso los usuarios chinos, cuyo idioma Python no se parece en nada, lo entenderá de un vistazo, donde la sintaxis un poco menos común tomará un par de ciclos cerebrales adicionales para analizar.

No seas diferente solo por el bien de ser diferente, al menos en este campo.


26
2018-04-26 07:18



Pitón if x is not None o if not x is None?

TLDR: el compilador de códigos de bytes los analiza a ambos x is not None - por razones de legibilidad, use if x is not None.

Legibilidad

Usamos Python porque valoramos cosas como la legibilidad humana, la usabilidad y la corrección de varios paradigmas de programación sobre el rendimiento.

Python optimiza la legibilidad, especialmente en este contexto.

Analizando y compilando el bytecode

los not  se une más débilmente que is, entonces no hay diferencia lógica aquí. Ver el documentación:

Los operadores is y is not prueba de identidad de objeto: x is y es verdad   si y solo si xey son el mismo objeto. x is not y cede el   valor de verdad inverso.

los is not está específicamente previsto en Python gramática como una mejora de legibilidad para el lenguaje:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

Y también es un elemento unitario de la gramática.

Por supuesto, no se analiza de la misma manera:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

Pero luego el compilador de bytes realmente traducirá el not ... is a is not:

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

Por lo tanto, para facilitar la lectura y utilizar el idioma como estaba previsto, utilice is not.

Para no usarlo no es sabio.


14
2017-07-20 16:18



los is not el operador es preferible a la negación del resultado de is por razones estilísticas. "if x is not None:"se lee como en inglés, pero"if not x is None:"requiere la comprensión de la precedencia del operador y no se lee como inglés.

Si hay una diferencia de rendimiento, mi dinero está en is not, pero esta no es la motivación para tomar la decisión de preferir esa técnica. Obviamente, dependería de la implementación. Ya que is no es imposible, debería ser fácil optimizar cualquier distinción de todos modos.


8
2018-04-26 04:32



Personalmente, yo uso

if not (x is None):

que se entiende inmediatamente sin ambigüedad por cada programador, incluso aquellos que no son expertos en la sintaxis de Python.


4
2018-06-26 16:14



if not x is None es más similar a otros lenguajes de programación, pero if x is not None definitivamente suena más claro (y es más correcto gramaticalmente en inglés) para mí.

Dicho esto, parece que es más una cuestión de preferencia para mí.


1
2018-04-26 03:14



Preferiría la forma más legible x is not y de lo que yo pensaría cómo eventualmente escribir el código manejando la precedencia de los operadores para producir un código mucho más legible.


0
2017-09-24 07:19



Prueba esto:

    if x != None:
       # do stuff with x

-3
2017-07-16 15:06