Is there a Python equivalent of the C# null-coalescing operator?
other = s or "some default value"
Ok, it must be clarified how the
or operator works. It is a boolean operator, so it works in a boolean context. If the values are not boolean, they are converted to boolean for the purposes of the operator.
Note that the
or operator does not return only
False. Instead, it returns the first operand if the first operand evaluates to true, and it returns the second operand if the first operand evaluates to false.
In this case, the expression
x or y returns
x if it is
True or evaluates to true when converted to boolean. Otherwise, it returns
y. For most cases, this will serve for the very same purpose of C♯'s null-coalescing operator, but keep in mind:
42 or "something" # returns 420 or "something" # returns "something"None or "something" # returns "something"False or "something" # returns "something""" or "something" # returns "something"
If you use your variable
s to hold something that is either a reference to the instance of a class or
None (as long as your class does not define members
__len__()), it is secure to use the same semantics as the null-coalescing operator.
In fact, it may even be useful to have this side-effect of Python. Since you know what values evaluates to false, you can use this to trigger the default value without using
None specifically (an error object, for example).
In some languages this behavior is referred to as the Elvis operator.
other = s if s is not None else "default value"
s = False will become
"default value", which may not be what was intended.
If you want to make this shorter, try:
def notNone(s,d): if s is None: return d else: return sother = notNone(s, "default value")
Here's a function that will return the first argument that isn't
def coalesce(*arg): return reduce(lambda x, y: x if x is not None else y, arg)# Prints "banana"print coalesce(None, "banana", "phone", None)
reduce() might needlessly iterate over all the arguments even if the first argument is not
None, so you can also use this version:
def coalesce(*arg): for el in arg: if el is not None: return el return None