No Ninguna prueba en Python [duplicado]
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- Python `si x no es None` o` si no es x None`? 9 respuestas
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é?
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