2010-02-24 18 views

Respuesta

10

No creo que tenga un nombre oficial, es solo una manera inteligente/perezosa de ser conciso. Es más o menos equivalente a:

a = b if b else {} 

o:

if b: 
    a = b 
else: 
    a = {} 

escribí esto como un comentario, pero creo que vale la pena mencionar aquí:

Hay que tener mucho cuidado al usar este truco. Si su intención es establecer un valor predeterminado cuando algo es Ninguno, sería mejor escribir esa prueba is None explícitamente que usar este truco. El motivo es que None no es lo único que se evalúa como falso en un contexto booleano. 0, [], {}, ... también evalúan a falso. Entonces este truco podría no darle los resultados esperados si no piensa en estos casos especiales.

Aquí hay una manera de hacerlo que es más seguro:

a = b if b is not None else {} 
+0

así que vamos a darle uno :) –

+0

¿Bastante como var a = b ?? nuevo b() en C#. –

+1

@Filip: Similar, excepto que el operador nulo-coalescente '??' se agregó a C# intencionalmente para ese propósito. Este truco en Python funciona porque None se trata como falso en un contexto booleano. Pero 0, [], {}, etc ... también evalúan como falso, así que ten cuidado. Si desea emular '??', es mejor escribir explícitamente la prueba '' None' que confiar en este truco. –

1

Eso no es una construcción especial, al menos a los ojos un poco cansados. Está diciendo asignar el resultado de

(b or {}) 

a a.

lo tanto, si b es un valor falso, una consigue {} (el diccionario vacío literal), de lo contrario se obtiene el valor de b.

+0

exactamente, pero tal vez haya un nombre para ello. La asignación de cortocircuito es la que estaría tentado de decir. tal vez asignación condicional? Pero eso normalmente se refiere al operador?: –

+0

No depende realmente de ningún tipo de cortocircuito, sin embargo ... Yo iría por eso si estuviera suprimiendo algún efecto secundario en el RHS. Pero para esto? –

+0

Es una "construcción especial" si vienes de C++ o Java, donde las únicas cosas que puedes poner en cualquier lado de un "o" son booleanos. Aquí, b podría ser cualquier objeto (presumiblemente un diccionario basado en el contexto) entonces (b o {}) es * no * un booleano. Perfectamente normal para Pythonista, pero no es obvio si estás aprendiendo Python por primera vez. – MatrixFrog

1

asignación predeterminada del idioma

+1

oficial o inventado por usted en este momento? –

+1

@Stefano, pensé que votaríamos por lo que creemos que debería ser el nombre oficial :) –

2

La expresión b or {} es sólo un simple boolean OR expression. El especial de esto es simplemente que esta expresión no tiene que devolver un valor booleano, por definición, al igual que en otros idiomas:

La expresión x or y primero evalúa x; si x es verdadero, se devuelve su valor; de lo contrario, se evalúa y y se devuelve el valor resultante.

(Tenga en cuenta que ni and ni or restringen el valor y el tipo regresan a False y True, sino más bien devolver el último argumento evaluado. Esto a veces es útil, por ejemplo, si s es una cadena que debe ser reemplazado por un defecto valor si está vacío, la expresión s or 'foo' produce el valor deseado. Dado que not tiene que inventar un valor de todos modos, no se molesta en devolver un valor del mismo tipo que su argumento, por ejemplo, not 'foo' produce False, no '').

Cuestiones relacionadas