2010-06-10 18 views
7

Una de las ideas de la filosofía de diseño de Python es "Debería haber una ... forma obvia de hacerlo". (PEP 20), pero eso no siempre puede ser cierto. Me refiero específicamente a las declaraciones (simples) if frente a la evaluación booleana. Considere lo siguiente:Estilo Python: sentencias if versus evaluación booleana

if words: 
    self.words = words 
else: 
    self.words = {} 

frente

self.words = words or {} 

Con una situación tan sencilla, que es preferible, estilísticamente hablando? Con situaciones más complicadas, uno elegiría la declaración if para la legibilidad, ¿verdad?

+0

Practicality beats pureity. –

+0

definitivamente o :) –

Respuesta

9

"Hay debe ser solo uno" perfectamente puede ser siempre cierto; es la afirmación positiva "no es único" que no puede ser - "debería" implica un objetivo, una meta, no la posibilidad de estar siempre llegar a ella (por ejemplo, para los números a y b, prohibiendo o bien b + a o a + b sería tan absurdo que simplemente no puede ser sensatamente "solo una forma" en este caso).

En su ejemplo, estoy de acuerdo en que el or es preferible en casos suficientemente simples (cuatro líneas para hacer lo que se puede hacer en una línea clara y legible es un desperdicio de espacio vertical) pero no para un predicado significativo complejidad. Decidir qué tiene "complejidad significativa" es, por supuesto, una decisión.

0

(Edited)
bien en un caso como el de abajo, yo voto por la expresión condicional

def somesuch(self, words=None): 
    self.words = words or {} 
    ... 

por supuesto, si usted piensa que habría mejorar la legibilidad (se puede leer en voz alta de esa manera?) , puede intentar

self.words = words if words else {} 
+0

¡Tienes razón! De hecho, toda esta pregunta se inspiró tratando de hacer eso con una definición de clase y encontrando que todas mis instancias compartieran el mismo atributo de diccionario. –

+1

-1: Probablemente no desee hacer esto (al menos no en general): los argumentos predeterminados mutables pueden sorprenderlo. Ver http://stackoverflow.com/questions/1132941/ por ejemplo. –

+0

@Scott Griffiths: ugh, lo siento. No lo he sufrido todavía, supongo, ya que no pensé en eso. gracias por la URL entonces ** no hay argumentos por defecto mutables ** en python.mantén el -1, espero que me ayude a recordar la lección –

2

En este caso yo diría que "explícito es mejor que implícito".

Cuando alguien lee su código, pueden hacer algunas suposiciones. Pueden suponer que "palabras" puede ser un dict vacío o uno con datos (faltan el caso cuando es Ninguno) En ese caso, podrían tener la tentación de optimizar su código. Incluso pueden estar en lo cierto al hacerlo, si no se indica en ningún lugar, puede obtener un valor Ninguno.

Si "palabras" pueden de hecho ser Ninguno, yo trataba de tener claro que con:

self.words = words 
if words is None: 
    self.words = {} 

o posiblemente una "cosa" en lugar de la asignación incondicional primera. En cualquier caso, de esta manera documenta el hecho de que Ninguno es un valor esperado para "palabras".