variable validate not none python nonetype

validate - python null variable



no prueba de ninguno en Python (4)

Esta pregunta ya tiene una respuesta aquí:

Fuera de estas pruebas no hay ninguna.

if val != None: if not (val is None): if val is not None:

¿Cuál es preferible y por qué?


Cualquiera de los dos últimos, ya que val podría ser potencialmente de un tipo que define __eq__() para devolver verdadero cuando se pasa None .


De, Recomendaciones de programación, PEP 8 :

Las comparaciones con singletons como None deben hacerse siempre con ''is'' o ''is not'', nunca con los operadores de igualdad.

Además, tenga cuidado de escribir "si x" cuando realmente quiere decir "si x no es Ninguno", por ejemplo, al probar si una variable o argumento que por defecto es Ninguno se estableció en algún otro valor. ¡El otro valor podría tener un tipo (como un contenedor) que podría ser falso en un contexto booleano!

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


La mejor opción para este tipo de preguntas es ver exactamente qué hace python. 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 usa el operador is not ). El primero usa el operador != Cuando se compara con Ninguno.

Como lo señalan otras respuestas, usar != Cuando se compara con Ninguno es una mala idea


if val is not None: # ...

es el idioma Pythonic para probar que una variable no está configurada como None . Este idioma tiene usos particulares en el caso de declarar funciones de palabras clave con parámetros predeterminados . Pruebas de identidad en Python. Debido a que hay una y solo una instancia de None presente en una secuencia de comandos / programa de Python, es la prueba óptima para esto. Como señala Johnsyweb , esto se discute en el PEP 8 bajo "Recomendaciones de programación".

En cuanto a por qué se prefiere esto

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

esto es simplemente parte del Zen de Python : "La legibilidad cuenta". Good Python suele estar cerca de un buen pseudocode .