2011-08-12 9 views
10

¿Hay alguna de bajo nivel, diferencia relativas a la aplicación (rendimiento-ish) entre estos enfoques ..?Python: pruebas para Ninguno, las pruebas de valor booleano

# check if string is empty 
# the preferred way it seems [1] 
if string: 
    print string 
else: 
    print "It's empty." 

# versus [2] 
if string is '': 

# or [3] 
if string == '': 

Por ejemplo, cuando las pruebas de None, todavía me resulta más fácil de leer y explícito que debe hacer:

if some_var is not None: 

..instead de ..

if not some_var: 

if not some_var, al menos para mí, siempre dice "si some_var no existe".

¿Cuál es mejor usar, cuáles son los casos de uso adecuados para ==, is y bool-testing?

Respuesta

8

Nunca use para is (valor) las pruebas de igualdad. Úselo solo para probar la identidad del objeto. Puede funcionar para el ejemplo if string is '', pero esto depende de la implementación y no puede confiar en él.

>>> a = "hi" 
>>> a is "hi" 
True 
>>> a = "hi there!" 
>>> a is "hi there!" 
False 

Aparte de eso, use lo que transmita mejor el significado de su código.

Prefiero el más corto if string:, pero if string != '': puede ser más explícito.

Por otra parte if variable: obras de todo tipo de objetos, por lo que si variable no se limita a un tipo, esto es mejor que if variable != "" and variable != 0: etc.

+1

Grandes, gracias por la respuesta. Y el "uso lo que transmite mejor el significado de su código": esto es algo muy bueno que debe tener en cuenta al codificar, así como al defender sus soluciones. – maligree

2

En primer lugar, no utilice if string is '': porque esto no se garantiza que funcione . El hecho de que CPython haga prácticas cortas es un detalle de implementación y no se debe confiar en él.

El uso de if string: para comprobar que string no está vacío es, creo, una forma pitónica de hacerlo.

Pero no hay nada mal sobre el uso de if string == ''.

+0

Muy bien, genial. ¿Podrías expandir las 'cuerdas cortas de internos de CPython', o señalarme en algún lugar donde podría obtener más información? – maligree

+0

http://en.wikipedia.org/wiki/String_interning sería un lugar para empezar :) –

+0

... me siento ridícula. Debe haber estado medio dormido, se olvidó de jfGit. ¡Gracias! – maligree

5

Para ampliar la respuesta de Tim Pietzcker:

if string: 
    print string 

Esto comprueba si string se evalúa como TRUE. ES DECIR.

>>> bool("") 
False 
>>> bool(None) 
False 
>>> bool("test") 
True 

así que no es sólo un examen si está vacío, pero si es None o vacío. Esto podría tener un impacto dependiendo de cómo trate None/vacío.

Cuestiones relacionadas