The ternary operator in many languages works like so:
x = f() ? f() : g()
Where if f()
is truthy then x
is assigned the value of f()
, otherwise it is assigned the value of g()
. However, some languages have a more succinct elvis operator that is functionally equivalent:
x = f() ?: g()
In python, the ternary operator is expressed like so:
x = f() if f() else g()
But does python have the more succinct elvis operator?
Maybe something like:
x = f() else g() # Not actually valid python
Python does have the elvis operator. It is the conditional or
operator:
x = f() or g()
f()
is evaluated. If truthy, then x is assigned the value of f()
, else x is assigned the value of g()
.
Reference: https://en.wikipedia.org/wiki/Elvis_operator#Analogous_use_of_the_short-circuiting_OR_operator
NB Python does not have the null-coalescing operator defined by:
a if a is not None else b
The or
operator in a or b
checks the truthiness of a
which is False
when a==0
or len(a)==0
or other similar situations. See What is Truthy and Falsy
There is a proposal to add such operators PEP 505
Robᵩ's answer about using or
is a good suggestion. However, as a comment to the original question,
x = f() ? f() : g()
is functionally equivalent with
x = f() ?: g()
only if f()
has no side effects.
If, for instance, f()
reads from a stream or generator, calling it twice will have different results than calling it once. Rewriting slightly to Python syntax, the following sample
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)
will print 2, while x = f() or g()
would print 1.
It might be better to state the question as
tmp = f()
x = tmp ? tmp : g()
or, in Python,
tmp = f()
x = tmp if tmp else g()
or in Python 3.8 and up,
x = tmp if (tmp := f()) else g()
Both of the latter two examples are equivalent with
x = f() or g()
regardless of any side effects f()
might have.