2011-08-22 39 views
26

Siempre he codificado en el estilo de if not value, sin embargo, algunas guías me han llamado la atención que aunque este estilo funciona, parece tener 2 problemas potenciales:Python: si no val, vs si val es None

  1. No es completamente legible; if value is None es seguramente más comprensible.
  2. Esto puede tener implicaciones más adelante (y causar errores sutiles), ya que cosas como [] y 0 evaluarán también a False.

También estoy empezando a aplicar esta idea a otras comparaciones, tales como:

  • if not value vs if value is False
  • if not value vs if value is []

Y así va la lista ...

La pregunta es, ¿qué tan lejos vas con la p ¿Principio? ¿Dónde dibujar la línea, mientras mantiene su código seguro?

¿Debo utilizar siempre el estilo if value is None pase lo que pase?

+0

Una de las disciplinas de escritura de Pythons es ** pato ** tipado. En el caso de 'None',' [] ',' 0' y así sucesivamente eso significa 'Si algo parece nada, actúa como nada, entonces no es nada. Si necesita ser más explícito sobre el valor que se prueba, use '=='. – nagisa

Respuesta

11

Utilice una comparación con None si eso es lo que desea. Use "if not value" si solo desea verificar si el valor se considera falso (lista vacía, ninguno, falso).

Encuentro "si no es valor" para ser más limpio y Pythonic.

Además, tenga 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()). Pruebe a escribir esto en el intérprete:

>>> a = [] 
>>> a is [] 
False 

Esto es debido a que la lista temporal que acaba de hacer tiene una dirección diferente en la memoria que la almacenada en 'A'. No ve esto con Ninguno, Falso o Verdadero porque estos son todos los valores que son únicos (todos se refieren a la misma sección de memoria), por lo que funciona la palabra clave 'es'.

También encontrará que CPython pone en práctica cadenas para que funcione lo siguiente.

>>> 'a' is 'a' 
True 

Usted debe no depender de esto. Es un detalle de implementación y no está especificado para trabajar con cada versión de Python.

+0

Buena captura. Acabo de aprender algo nuevo sobre el operador 'is'. :) De un poco más de investigación, encontré que 'if not' es apropiado para cosas como' 0' y '[]' y 'False', y como se dijo,' if value is None' for 'None'. Tiene sentido, ya que 'if not' siempre será boolean, pero' if not' for 'None' es una historia diferente, por lo tanto' si el valor es None'. :) –

16

No. Si desea ejecutar código cuando el valor es falso pero no es None, esto fallaría horriblemente.

Use is None si está buscando identidad con el objeto None. Use not value si solo quiere que el valor sea falso.

1

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. Intenta expresar tu intención lo más claramente posible. Si desea verificar si un valor es falso, use if not value. Si desea verificar None, escríbalo. Siempre depende de la situación y tu juicio.

No intente encontrar reglas que puedan aplicarse sin pensar. Si encuentra esas reglas, es un trabajo para una computadora. ¡Ni para un humano! ;-)

1
if not value: 
    pass 

está bien y "pythonic". No causa errores sutiles, las reglas son explícitas y (me parece) easy to understand.

Si necesita diferenciar entre falso y ninguno, como usted ha mencionado el uso:

if not value is None: # or False, or == [], etc. 
    pass 

encuentro el anterior aunque rara vez es necesario.

En general, sin embargo, se prefiere realizar 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 
+0

Es por eso que lo he dicho _puede causar errores sutiles. Prefiero no entrar en detalles, pero este [post] (http://boodebr.org/main/python/tourist/none-empty-nothing) debería explicarlo. :) –

+0

Disculpas, pero debe determinar la prueba correcta y aplicarla. La publicación de blog vinculada es de alguien que no comprende las reglas de prueba de la verdad de Python y quiere utilizar las C en su lugar. Los errores "sutiles" son los que ocurren cuando uno no comprende las reglas. –

4

Su uso del operador is 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.