Pregunta

Esta pregunta ya tiene una respuesta aquí:

A partir de estas pruebas no Ninguno.

if val != None:

if not (val is None):

if val is not None:

¿Cuál es preferible, y por qué?

¿Fue útil?

Solución

if val is not None:
    # ...

es el idioma Pythonic para probar que una variable no está ajustado a None. Este idioma tiene usos particulares en el caso de declarar funciones de palabras clave con parámetros por defecto . is pruebas de identidad en Python. Debido a que existe una y sólo una instancia de None presente en una secuencia de comandos de Python / programa que se ejecuta, is es la prueba óptima para esto. Como Johnsyweb puntos fuera , esto se discute en PEP 8 en "recomendaciones de programación".

Como para qué esto se prefiere

if not (val is None):
    # ...

esto es simplemente parte de la Zen de Python : "La legibilidad cuenta ". Buena Python es a menudo cerca de buena pseudocódigo .

Otros consejos

A partir de, recomendaciones de programación, PEP 8 :

Las comparaciones con embarazos únicos como Ninguno debe siempre hacerse con 'Es' o 'no es', nunca a los operadores de igualdad.

Además, tenga cuidado de escribir "si x" cuando en realidad quieren decir "si x no es ninguno" -- p.ej. al probar si una variable o argumento de que por defecto Ninguno se establece en algún otro valor. El otro valor podría tener un tipo de (Tal como un recipiente) que podría ser falso en un contexto booleano!

PEP 8 es una lectura esencial para cualquier programador de Python.

Cualquiera de los dos últimos, ya que val podría potencialmente ser de un tipo que define __eq__() para volver cierto cuando pasado None.

La mejor apuesta con este tipo de preguntas es para ver exactamente lo que hace pitón. El módulo dis es increíblemente informativo:

>>> def f(val):
...   if val != None:
...     return True
...   return False
...
>>> def g(val):
...   if not (val is None):
...     return True
...   return False
...
>>> def h(val):
...   if val is not None:
...     return True
...   return False
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               3 (!=)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE
>>> dis.dis(h)
  2           0 LOAD_FAST                0 (val)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 POP_JUMP_IF_FALSE       16

  3          12 LOAD_GLOBAL              1 (True)
             15 RETURN_VALUE

  4     >>   16 LOAD_GLOBAL              2 (False)
             19 RETURN_VALUE

Tenga en cuenta que los dos últimos casos se reducen a la misma secuencia de operaciones (Python lee not (val is None) y utiliza el operador is not). El primero utiliza el operador != cuando se comparan con Ninguna.

Como se ha comentado en otras respuestas, utilizando != cuando se compara con ninguno es una mala idea

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top