El operador ternario en muchos idiomas funciona así:
x = f() ? f() : g()
Donde si f()
es veraz, entonces a x
se le asigna el valor de f()
, de lo contrario, se le asigna el valor de g()
. Sin embargo, algunos idiomas tienen un operador elvis más sucinto que es funcionalmente equivalente:
x = f() ?: g()
En Python, el operador ternario se expresa así:
x = f() if f() else g()
¿Pero Python tiene el operador Elvis más sucinto?
Tal vez algo como:
x = f() else g() # Not actually valid python
Python tiene el operador elvis. Es el condicional or
operador:
x = f() or g()
f()
es evaluado. Si es cierto, entonces a x se le asigna el valor de f()
, de lo contrario, a x se le asigna el valor de g()
.
Referencia: https://en.wikipedia.org/wiki/Elvis_operator#Analogous_use_of_the_short-circuiting_OR_operator
NB Python no tiene el operador de fusión nula definido por:
a if a is not None else b
El operador or
en a or b
comprueba la veracidad de a
que es False
cuando a==0
o len(a)==0
u otras situaciones similares. Vea lo que es verdadero y falso
Hay una propuesta para agregar tales operadores PEP 505
La respuesta de Robᵩ sobre el uso de or
es una buena sugerencia. Sin embargo, como comentario a la pregunta original,
x = f() ? f() : g()
es funcionalmente equivalente a
x = f() ?: g()
solo si f()
no tiene efectos secundarios.
Si, por ejemplo, f()
lee desde un flujo o generador, llamarlo dos veces tendrá resultados diferentes que llamarlo una vez. Reescribiendo ligeramente a la sintaxis de Python, la siguiente muestra
values = (x for x in (1, 2, 3)) def f(): return next(values) def g(): return 42 x = f() if f() else g() print(x)
imprimirá 2, mientras que x = f() or g()
imprimirá 1.
Sería mejor formular la pregunta como
tmp = f() x = tmp ? tmp : g()
o, en Python,
tmp = f() x = tmp if tmp else g()
o en Python 3.8 y versiones posteriores,
x = tmp if (tmp := f()) else g()
Los dos últimos ejemplos son equivalentes a
x = f() or g()
independientemente de los efectos secundarios que pueda tener f()
.