Python中是否有与C#null-conditional operator相同的内容?
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
答案 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