一个班轮 "assign if not None"
One liner to "assign if not None"
有没有办法只在赋值不是None时才赋值,否则什么都不做?
当然可以:
x = get_value() if get_value() is not None
但这将读取该值两次。我们可以将它缓存到一个局部变量中:
v = get_value()
x = v if v is not None
但是现在我们为了一件简单的事情做了两份声明。
我们可以写一个函数:
def return_if_not_none(v, default):
if v is not None:
return v
else:
return default
然后x = return_if_not_none(get_value(), x)
。但肯定已经有一个 Python 成语来完成这个,而不需要访问 x
或 get_value()
两次,也不需要创建变量?
换句话说,假设 =??
是类似于 C# null coalesce operator 的 Python 运算符。与 C# ??=
不同,我们虚构的运算符检查右侧是否为 None
:
x = 1
y = 2
z = None
x =?? y
print(x) # Prints "2"
x =?? z
print(x) # Still prints "2"
这样的 =??
运算符将完全按照我的问题进行操作。
在 python 3.8 中你可以这样做
if (v := get_value()) is not None:
x = v
根据 Ryan Haining 解决方案更新,见评论
有没有办法只在赋值不是None时才赋值,否则什么都不做?
当然可以:
x = get_value() if get_value() is not None
但这将读取该值两次。我们可以将它缓存到一个局部变量中:
v = get_value()
x = v if v is not None
但是现在我们为了一件简单的事情做了两份声明。
我们可以写一个函数:
def return_if_not_none(v, default):
if v is not None:
return v
else:
return default
然后x = return_if_not_none(get_value(), x)
。但肯定已经有一个 Python 成语来完成这个,而不需要访问 x
或 get_value()
两次,也不需要创建变量?
换句话说,假设 =??
是类似于 C# null coalesce operator 的 Python 运算符。与 C# ??=
不同,我们虚构的运算符检查右侧是否为 None
:
x = 1
y = 2
z = None
x =?? y
print(x) # Prints "2"
x =?? z
print(x) # Still prints "2"
这样的 =??
运算符将完全按照我的问题进行操作。
在 python 3.8 中你可以这样做
if (v := get_value()) is not None:
x = v
根据 Ryan Haining 解决方案更新,见评论