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

时间:2016-07-09 20:03:04

标签: c# python

Python中是否有与C#null-conditional operator相同的内容?

System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error

4 个答案:

答案 0 :(得分:8)

怎么样:

RSA

如果sb为Falsy,则短路布尔值停止,否则返回下一个表达式。

顺便说一句,如果获得“无”很重要......

s = sb and sb.ToString()

输出:

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)

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

PEP-505下有一个提案,与此同时有一个图书馆:

.App {
  font-family: sans-serif;
  text-align: center;
}

.box_one_displayed {
  /* position: fixed;*/
  left: 200px;
  /* height: 100vh;*/
  background-color: grey;
  transition: all 0.5s linear;
}

.box_one_hidden {
  /* position: fixed;*/
  left: 0;
  /* height: 100vh;*/
  background-color: grey;
  transition: all 0.5s linear;
}

.box_two_displayed {
  position: fixed;
  z-index: 500;
  width: 200px;
  left: 0;
  background-color: cyan;
  transition: all 0.5s linear;
}

.box_two_hidden {
  position: fixed;
  z-index: 500;
  width: 200px;
  left: -200px;
  background-color: cyan;
  transition: all 0.5s linear;
}

.toggler {
  position: fixed;
  top: 50px;
  left: 350px;
  cursor: pointer;
  background-color: pink;
}

答案 3 :(得分: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

这是我跑过的一些测试,所以你可以看到它是如何工作的

class A(object):
    b = None
    def __init__(self, v):
        self.b = v

class B(object):
    c = None
    def __init__(self, v):
        self.c = v    

a_1 = A(B(2))
a_2 = A(None)
print(null_conditional(a_1, 'b', 'c')) # 2
print(null_conditional(a_1, 'b', 'd')) # None
print(null_conditional(a_2, 'b', 'c')) # None
print(null_conditional(None, 'b')) # None
print(null_conditional(None, None)) # TypeError: attribute name must be string