else - Python: si no val, vs si val es None
null none python (5)
Mi respuesta es simple, ya que se aplica a la mayoría de los problemas de codificación: no intente escribir algo que simplemente funcione. Trate de expresar su intención lo más claramente posible. Si desea verificar si un valor es falso, use if not value
. Si quiere marcar None
, escríbalo. Siempre depende de la situación y tu juicio.
No debes tratar de encontrar reglas que puedan aplicarse sin pensar. Si encuentras esas reglas, es un trabajo para una computadora. ¡Ni para un humano! ;-)
Siempre he codificado el estilo de if not value
, sin embargo, algunas guías me han llamado la atención sobre que, si bien este estilo funciona, parece tener 2 problemas potenciales:
- No es completamente legible;
if value is None
es seguramente más comprensible. - Esto puede tener implicaciones más adelante (y causar errores sutiles), ya que cosas como
[]
y0
se evaluarán comoFalse
también.
También estoy comenzando a aplicar esta idea a otras comparaciones, tales como:
-
if not value
vsif value is False
-
if not value
vsif value is []
Y así va la lista ...
La pregunta es, ¿qué tan lejos llegas con el principio? ¿Dónde dibujar la línea, manteniendo su código seguro?
¿Debo usar siempre el if value is None
style no importa qué?
No. Si quiere ejecutar código cuando el valor es falso pero no es None
, fallará de manera horrible.
El uso is None
si está buscando identidad con el objeto None
. Use not value
si solo quiere que el valor sea falso.
Su uso del operador es un poco problemático. if value is []
siempre será falso, por ejemplo, porque no hay dos listas activas que tengan la misma identidad. Funciona muy bien con None
porque None
es un singleton (todas las referencias a None
son el mismo objeto) pero para otras comparaciones, use ==
.
Sin embargo, if value
y if not value
son perfectamente legibles y útiles. En mi humilde opinión, no hay necesidad de ser más específico, a menos que necesite tratar diferentes tipos de valores de falsedad o falsedad de manera diferente, como, por ejemplo, distinguir entre 0 y None
.
Usa una comparación a Ninguna si eso es lo que quieres. Utilice "si no es valor" si solo desea verificar si el valor se considera falso (lista vacía, ninguno, falso).
Encuentro "si no valor" para ser más limpio y Pythonic.
Además, ten cuidado con las listas. No deberías usar es al comparar para una lista vacía. Si sabe que está obteniendo una lista, use "si" para verificar si tiene algún contenido (o len ()). Prueba a escribir esto en el intérprete:
>>> a = []
>>> a is []
False
Esto se debe a que la lista temporal que acaba de crear tiene una dirección diferente en la memoria que la almacenada en ''a''. No ve esto con Ninguno, Falso o Verdadero porque todos estos son valores que son singletons (todos se refieren a la misma sección de la memoria), por lo que usar la palabra clave ''is'' funciona.
También encontrará que CPython pone en práctica cadenas para que funcione lo siguiente.
>>> ''a'' is ''a''
True
No debes confiar en esto. Es un detalle de implementación y no se especifica para que funcione con todas las versiones de Python.
if not value:
pass
Está bien y es "pitónico". No causa errores sutiles, las reglas son explícitas y (me parece) fáciles de entender .
Si necesita diferenciar entre False y None, como mencionó, use:
if not value is None: # or False, or == [], etc.
pass
Sin embargo, encuentro que lo anterior rara vez es necesario.
En general, sin embargo, se prefiere hacer condiciones positivas. Son más fáciles de entender de un vistazo y se mantienen bien a medida que aumenta la complejidad (como siempre parece).
if value:
pass
else:
pass