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() .