Does Python Have The Elvis Operator?
Solution 1:
Yes
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
Solution 2:
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
Solution 3:
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))
deff(): returnnext(values)
defg(): return42
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.
Solution 4:
>>>a = [1,2,3]>>>b = [4,5,6]>>>c = [4]>>>a + (b,c)[b>c]
[1, 2, 3, 4]
>>>a + (b,c)[b<c]
[1, 2, 3, 4, 5, 6]
>>>
Python elvis operation is
(testIsFalse, testIsTrue)[test]
The Java equivalent is
test ? testIsTrue:testIsFalse
Post a Comment for "Does Python Have The Elvis Operator?"