带条件表达式的赋值表达式
assignment expressions with conditional expression
以下片段
def expensive_function(x):
return x
x = 10.5
(int(y) if y.is_integer() else y := expensive_function(x))
加注
SyntaxError: cannot use assignment expressions with conditional expression
赋值表达式不能这样用吗?
如果不是,我的假设有什么问题:我的印象是这个想法是在单个表达式中为昂贵的操作预先分配一个虚拟值。
为了澄清这个想法,询问是否可以通过将 expensive_function(x)
分配给虚拟变量
来使用赋值操作来简化
def expensive_function(x):
return x
x = 10.5
(int(expensive_function(x))
if expensive_function(x).is_integer()
else expensive_function(x))
int(y) if y.is_integer() else y := expensive_function(x)
相当于
def foo(x):
if y.is_integer():
return int(y)
else:
y = expensive_function(x)
return y
foo(x)
现在你可以看出问题出在哪里了。 y
未定义!
怎么样
z = int(y) if (y := expensive_function(x)).is_integer() else y
?
实际上,在 a if cond else b
中有两个条件表达式:a
- 和 b
- 成员。但是中间成员,即 cond
不是有条件的:它 总是求值 ,解释了为什么在那里使用赋值运算符不会引发错误。
prior-to-3.8 方法(即没有 Walrus Operator)可以是
z = (
lambda y: int(y) if y.is_integer() else y
)(
expensive_function(x)
)
以下片段
def expensive_function(x):
return x
x = 10.5
(int(y) if y.is_integer() else y := expensive_function(x))
加注
SyntaxError: cannot use assignment expressions with conditional expression
赋值表达式不能这样用吗?
如果不是,我的假设有什么问题:我的印象是这个想法是在单个表达式中为昂贵的操作预先分配一个虚拟值。
为了澄清这个想法,询问是否可以通过将 expensive_function(x)
分配给虚拟变量
def expensive_function(x):
return x
x = 10.5
(int(expensive_function(x))
if expensive_function(x).is_integer()
else expensive_function(x))
int(y) if y.is_integer() else y := expensive_function(x)
相当于
def foo(x):
if y.is_integer():
return int(y)
else:
y = expensive_function(x)
return y
foo(x)
现在你可以看出问题出在哪里了。 y
未定义!
怎么样
z = int(y) if (y := expensive_function(x)).is_integer() else y
?
实际上,在 a if cond else b
中有两个条件表达式:a
- 和 b
- 成员。但是中间成员,即 cond
不是有条件的:它 总是求值 ,解释了为什么在那里使用赋值运算符不会引发错误。
prior-to-3.8 方法(即没有 Walrus Operator)可以是
z = (
lambda y: int(y) if y.is_integer() else y
)(
expensive_function(x)
)