Python 相当于 C# 6 中引入的 null 条件运算符

问题描述 投票:0回答:4

Python 中是否有相当于 C# 的空条件运算符

System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
c# python
4个回答
38
投票

怎么样:

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这种以代码可读性为荣的语言来做这件事是个好主意吗?

我:不,我不。 这回答了问题 - 并说明了布尔短路的某些方面 - 但过于“聪明”了一半。 如果您有理由使用此表单,请这样做,但请注意,乍一看其意图并不十分清楚。


19
投票

PEP-505下有一个提案,同时有一个用于此的库:

from pymaybe import maybe

print(maybe(None).toString())

15
投票

嗯,最简单的解决方案是:

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')()

这里,权衡是函数调用开销,但代码更清晰,特别是当您多次使用它时。


1
投票

我用您所需的行为编写了这个函数。与链接相比,它的一个优点是,当涉及长链时,它更容易编写。注意,这不适用于对象键,仅适用于属性。


and

这是我运行的一些测试,以便您可以了解它是如何工作的

def null_conditional(start, *chain): current = start for c in chain: current = getattr(current, c, None) if current is None: break return current

	
© www.soinside.com 2019 - 2024. All rights reserved.