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

And*_*hev 14 c# python

Python中是否存在与C#null-conditional运算符相当的?

System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
Run Code Online (Sandbox Code Playgroud)

JL *_*ret 9

怎么样:

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)

  • 对于优先考虑可读性的语言来说,这是可怕的。 (3认同)
  • 如果sb不是`None`而是伪造的,则此解决方案会产生意外结果。例如,如果`sb =“”`则给出`“”`,而不是`“” .method()` (2认同)

Tan*_*may 6

那么,最简​​单的解决方案是:

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)

在这里,权衡是调用开销的函数,但更清晰的代码,特别是如果你多次使用它.

  • 谢谢,我知道这个方法,但希望有一个更短的方法来做到这一点. (2认同)

c z*_*c z 6

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

from pymaybe import maybe

print(maybe(None).toString())
Run Code Online (Sandbox Code Playgroud)