Respuesta
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 {}
así que vamos a darle uno :) –
¿Bastante como var a = b ?? nuevo b() en C#. –
@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. –
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.
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?: –
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? –
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
asignación predeterminada del idioma
oficial o inventado por usted en este momento? –
@Stefano, pensé que votaríamos por lo que creemos que debería ser el nombre oficial :) –
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
nior
restringen el valor y el tipo regresan aFalse
yTrue
, sino más bien devolver el último argumento evaluado. Esto a veces es útil, por ejemplo, sis
es una cadena que debe ser reemplazado por un defecto valor si está vacío, la expresións or 'foo'
produce el valor deseado. Dado quenot
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'
produceFalse
, no''
).
- 1. ¿Cuál es el nombre de este operador "+ ="?
- 2. ¿cuál es el nombre de este patrón?
- 3. ¿Cuál es el nombre de este antipatrón?
- 4. ¿cuál será el nombre oficial de C++ 0x?
- 5. ¿Cuál es el nombre para el tipo de constructo [x for x in some_list] en python?
- 6. ¿Cuál es el hogar oficial/activo del plugin MercurialEclipse?
- 7. ¿Cuál es el nombre de este operador =>?
- 8. ¿Cómo se llama este constructo (int) {1}?
- 9. ¿Cuál es el nombre oficial del código de 3 dígitos de una tarjeta de crédito?
- 10. ¿cuál es el nombre oficial del operador de flecha (->) de C++?
- 11. ¿Cuál es el nombre de este estilo de sangría en particular? ("apoyos apilados")
- 12. ¿Cómo se llama este constructo Bash (y/o otro shell?)?
- 13. ¿Cuál es el significado de este typedef?
- 14. C++ copia-constructo constructo-y-asignar pregunta
- 15. ¿Cuál es el nombre para este tipo de diagrama de flujo?
- 16. ¿Cuál es el nombre de tal notación?
- 17. ¿Cuál es el nombre de un algoritmo que produciría este relleno gráfico
- 18. ¿Cuál es el tiempo de ejecución de este algoritmo powerset
- 19. ¿Cuál es el propósito de este fragmento de CSS?
- 20. ¿Cuál es el propósito de este hack de JavaScript?
- 21. Javascript 'este' contra el nombre del objeto
- 22. ¿Cuál es el equivalente de VB.NET a este código C#?
- 23. ¿Cuál es el mejor esquema de SQL para este proyecto?
- 24. ¿Cuál es el beneficio de este .Net patrón
- 25. ¿Cuál es el equivalente de Java a este preg_replace?
- 26. ¿Cuál es el equivalente de PowerShell a este comando Bash?
- 27. ¿Cuál es el significado de este error C++ std :: length_error
- 28. ¿Cuál es el beneficio de Class.new en este Rspec
- 29. ¿Cuál es el uso de qGetPtrHelper en este ejemplo?
- 30. ¿Qué significa el constructo $ # en bash?
usted ver esto en Ruby, también. –
y perl si recuerdo correctamente –
también en Javascript también. – YOU