有没有C#空合并运算符的Python等价物?
在C#中有一个空合并运算符 (写成??
),允许在分配过程中进行简单的(短)空检查:
string s = null; var other = s ?? "some default value";
有一个python等价物吗?
我知道我可以这样做:
s = None other = s if s else "some default value"
但还有更短的路(我不需要重复)?
other = s or "some default value"
好的,必须弄清楚操作员是如何工作的。 它是一个布尔运算符,所以它在一个布尔上下文中工作。 如果这些值不是布尔值,那么为了运算符的目的,它们被转换为布尔值。
请注意, or
运算符不只返回True
或False
。 相反,如果第一个操作数的计算结果为true,则返回第一个操作数;如果第一个操作数的计算结果为false,则返回第二个操作数。
在这种情况下,如果x or y
expression式为True
,则返回x
如果转换为布尔值,则返回true。 否则,它返回y
。 对于大多数情况下,这将用于C♯空合并运算符的相同目的,但请记住:
42 or "something" # returns 42 0 or "something" # returns "something" None or "something" # returns "something" False or "something" # returns "something" "" or "something" # returns "something"
如果使用variabless
来保存某个类的实例的引用或者None
(只要你的类没有定义成员__nonzero__()
和__len__()
),那么使用相同的语义是安全的空合并运算符。
事实上,Python的这个副作用甚至是有用的。 由于您知道什么值的计算结果为false,因此可以使用它来触发默认值,而不使用“ None
(例如,错误对象)。
严格,
other = s if s is not None else "default value"
否则s = False将变成“默认值”,这可能不是预期的。
如果你想使这个更短,尝试
def notNone(s,d): if s is None: return d else: return s other = notNone(s, "default value")
这里有一个函数会返回不是None的第一个参数:
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()可能不必要地遍历所有的参数,即使第一个参数不是None,所以你也可以使用这个版本:
def coalesce(*arg): for el in arg: if el is not None: return el return None
除了朱利亚诺关于“或”的行为的答案:这是“快”
>>> 1 or 5/0 1
所以有时候这可能是一个很有用的捷径
object = getCachedVersion() or getFromDB()
下面的两个函数在处理很多variablestesting用例时发现非常有用。
def nz(value, none_value, strict=True): ''' This function is named after an old VBA function. It returns a default value if the passed in value is None. If strict is False it will treat an empty string as None as well. example: x = None nz(x,"hello") --> "hello" nz(x,"") --> "" y = "" nz(y,"hello") --> "" nz(y,"hello", False) --> "hello" ''' if value is None and strict: return_val = none_value elif strict and value is not None: return_val = value elif not strict and not is_not_null(value): return_val = none_value else: return_val = value return return_val def is_not_null(value): ''' test for None and empty string ''' return value is not None and len(str(value)) > 0