Python中是否存在与C#null-conditional运算符相当的?
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
Run Code Online (Sandbox Code Playgroud)
怎么样:
s = sb and sb.ToString()
Run Code Online (Sandbox Code Playgroud)
如果sb是Falsy,则短路布尔值停止,否则返回下一个表达式.
顺便说一下,如果得到无则很重要......
sb = ""
#we wont proceed to sb.toString, but the OR will return None here...
s = (sb or None) and sb.toString()
print s, type(s)
Run Code Online (Sandbox Code Playgroud)
输出:
None <type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)
那么,最简单的解决方案是:
result = None if obj is None else obj.method()
Run Code Online (Sandbox Code Playgroud)
但是如果你想要具有与C#的Null条件运算符相同的线程安全性的完全等价,那么它将是:
obj = 'hello'
temp = obj
result = None if temp is None else temp.split()
Run Code Online (Sandbox Code Playgroud)
权衡的是代码不是很漂亮; 此外,还会temp在命名空间中添加额外的名称.
另一种方式是:
def getattr_safe(obj, attr):
return None if obj is None else getattr(obj,attr)
obj = 'hello'
result = getattr_safe(obj,'split')()
Run Code Online (Sandbox Code Playgroud)
在这里,权衡是调用开销的函数,但更清晰的代码,特别是如果你多次使用它.
在PEP-505下有一个建议,同时有一个用于此的库:
from pymaybe import maybe
print(maybe(None).toString())
Run Code Online (Sandbox Code Playgroud)