有没有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运算符不只返回TrueFalse 。 相反,如果第一个操作数的计算结果为true,则返回第一个操作数;如果第一个操作数的计算结果为false,则返回第二个操作数。

在这种情况下,如果x or yexpression式为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