一个班轮 "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 成语来完成这个,而不需要访问 xget_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 解决方案更新,见评论