2012-08-07 9 views
12

Para uno de mis sitios, necesito verificar si varios atributos de clase están definidos y no están vacíos. Hasta ahora, he utilizado felizmente if self.attr:, que en mi opinión es la abreviatura de if self.attr is not None and self.attr is not '':, o cualquiera que sea el valor indefinido del atributo.Cadenas y el operador y: mejores prácticas, diferencias con +

Esto funciona bien, pero cede a un comportamiento sorprendente al verificar múltiples atributos de cadena. '' and '' no es False (como esperaba), pero ''.

Esto plantea la pregunta: ¿existen otros tipos para los cuales el operador and no fuerza un encasillado a bool? No puedo encontrar un ejemplo en el que esta diferencia de comportamiento cause un resultado diferente para la if -clause (después de todo, '' todavía se evalúa como False), pero me queda la impresión de que hay casos extremos que podrían ser una trampa.

Por último, me gustaría saber si alguien sabe por qué se implementó de esa manera? Pensé que el Zen de Python fomenta un camino y un solo camino, y el operador + ya parece ser el camino intuitivo para la concatenación de cadenas.

+1

¿podría poner el código aquí? –

+1

Las respuestas no parecen cubrir esto, centrándose en la parte booleana de la pregunta, pero 'y' nunca concatena la cadena; no es como '+' en absoluto. – geoffspear

+1

[Utilice ''' .join' para concatenar cadenas, no' + '.] (Http://stackoverflow.com/questions/1349311/python-string-join-is-faster-than-but-whats-wrong- aquí/1350289 # 1350289) – unutbu

Respuesta

13

and never typecasts to bool. Más bien, if llama al bool() en el resultado de las expresiones.

una expresión usando and (y or, para el caso), cortocircuitos cuando se puede determinar que la expresión no se evaluará como verdadero o falso sobre la base del primer operando y devuelve el último valor evaluado:

>>> 0 and 'string' 
0 
>>> 1 and 'string' 
'string' 
>>> 'string' or 10 
'string' 
>>> '' or 10 
10 

Este 'efecto secundario' se usa a menudo en el código python. Tenga en cuenta que nothace devuelve un valor booleano. Vea el python documentation on boolean operators para más detalles.

La documentación también explica lo que constituye una True o False equivalente de varios tipos, tales como None, 0, '' y los envases vacíos son False, mientras que casi todo lo demás es equivalente a True.

Para clases personalizadas, es necesario definir los .__nonzero__() method (retornos True o False) o un .__len__() method (devuelve un int, donde 0 es False y todo lo demás es True), para influir en su equivalente booleano, de lo contrario será siempre predeterminado a True.

Cuestiones relacionadas