Python 中是否有相当于 C# 的空条件运算符?
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
怎么样:
s = sb and sb.ToString()
如果 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))
输出:
None <type 'NoneType'>
过去有一些过分急于删除的评论,我想在这里复制一下作为警告:
评论者:你真的认为用Python这种以代码可读性为荣的语言来做这件事是个好主意吗?
我:不,我不。 这回答了问题 - 并说明了布尔短路的某些方面 - 但过于“聪明”了一半。 如果您有理由使用此表单,请这样做,但请注意,乍一看其意图并不十分清楚。
在PEP-505下有一个提案,同时有一个用于此的库:
from pymaybe import maybe
print(maybe(None).toString())
嗯,最简单的解决方案是:
result = None if obj is None else obj.method()
但是,如果您想要与 C# 的 Null 条件运算符具有相同的线程安全性的完全等效项,那就是:
obj = 'hello'
temp = obj
result = None if temp is None else temp.split()
代价是代码不太漂亮;命名空间中还添加了一个额外的名称
temp
。
另一种方法是:
def getattr_safe(obj, attr):
return None if obj is None else getattr(obj,attr)
obj = 'hello'
result = getattr_safe(obj,'split')()
这里,权衡是函数调用开销,但代码更清晰,特别是当您多次使用它时。
我用您所需的行为编写了这个函数。与链接相比,它的一个优点是,当涉及长链时,它更容易编写。注意,这不适用于对象键,仅适用于属性。
and
这是我运行的一些测试,以便您可以了解它是如何工作的
def null_conditional(start, *chain):
current = start
for c in chain:
current = getattr(current, c, None)
if current is None:
break
return current