Is there a Python equivalent of the C# null-coalescing operator?
在C中,有一个空合并运算符(写为
1 2 | string s = null; var other = s ??"some default value"; |
是否有与python等效的?
我知道我能做到:
1 2 | s = None other = s if s else"some default value" |
但是有没有一个更短的方法(我不需要重复
1 | other = s or"some default value" |
好的,必须澄清
注意,
在这种情况下,表达式
1 2 3 4 5 | 42 or"something" # returns 42 0 or"something" # returns"something" None or"something" # returns"something" False or"something" # returns"something" "" or"something" # returns"something" |
如果您使用变量
事实上,使用Python的这种副作用甚至可能很有用。由于您知道哪些值的计算结果为假,因此可以使用它来触发默认值,而无需特别使用
在某些语言中,这种行为称为ELVIS运算符。
严格地说,
1 | other = s if s is not None else"default value" |
否则,s=false将成为"默认值",这可能不是预期值。
如果你想把这个改短,试试看
1 2 3 4 5 6 7 | def notNone(s,d): if s is None: return d else: return s other = notNone(s,"default value") |
下面是一个函数,它将返回第一个不是none的参数:
1 2 3 4 5 | 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,因此您也可以使用此版本:
1 2 3 4 5 | def coalesce(*arg): for el in arg: if el is not None: return el return None |
我知道答案是肯定的,但在处理对象时还有另一个选择。
如果您的对象可能是:
1 2 3 4 5 6 | { name: { first:"John", last:"Doe" } } |
你可以使用:
1 | obj.get(property_name, value_if_null) |
像:
1 | obj.get("name", {}).get("first","Name is missing") |
通过添加
除了朱利亚诺关于"或"行为的回答之外:它是"快"的
1 2 | >>> 1 or 5/0 1 |
所以有时候它可能是一些有用的捷径
1 | object = getCachedVersion() or getFromDB() |
我发现下面的两个函数在处理许多可变测试用例时非常有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 |