Skip to content Skip to sidebar Skip to footer

Does Python Have The Elvis Operator?

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

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?"