gpt4 book ai didi

python - 为什么我不能分配给命名表达式(LHS 海象运算符)?

转载 作者:行者123 更新时间:2023-12-03 08:19:28 26 4
gpt4 key购买 nike

分配给表达式(而不是名称)在 Python 中很常见。例如,这是完全有效的语法:

my.object["with_some"].very_long["expression"] = func(my.object["with_some"].very_long["expression"], my.object["with_some"].very_long["expression"])
但是,如果我尝试使用海象运算符通过使 LHS 成为命名表达式来缩短它,例如
(x:=my.object["with_some"].very_long["expression"]) = func(x, x)
Python 引发了一个 SyntaxError:

SyntaxError: cannot assign to named expression


同样, for x[0] in range(5)是有效的语法(只是非常困惑),而 for (a:=x[0]) in range(5)又是一个 SyntaxError: cannot assign to named expression .
为什么我不能分配给命名表达式?这是设计还是实现?
PEP 572提到了一些不能使用海象运算符的情况,但除了一种情况外,所有情况都是关于无括号表达式的语法,最后一种情况是关于 f 字符串。与 this answer 中指出的情况不同( (self.x := ...) ),在我的例子中,海象运算符中的赋值目标是一个简单的名称/标识符,而不是表达式。从 the language reference 不清楚或者为什么这是不允许的。 Googling the error message在撰写本文时,今天正好产生三个结果:一个 issue about limitations in comprehensions , 一个 Stack Overflow chat message expecting hundreds of Hot Network Questions (没有发生)和 an issue in a 3rd-party Python parser ;没有人帮助我。
我无法分配给命名表达式的原因是什么?这是在某处记录或定义的设计规则,还是实现限制?据我所知,它不会导致任何歧义,而且我的用例似乎应该是有效的。

最佳答案

my.object["with_some"].very_long["expression"] = \
func(my.object["with_some"].very_long["expression"],
my.object["with_some"].very_long["expression"])`
是语法糖
my.object["with_some"].very_long.__setitem__(
"expression",
func(my.object["with_some"].very_long["expression"],
my.object["with_some"].very_long["expression"]))
所以它不像你想象的那么对称。原始长表达式的值,而不是表达式本身,作为两个参数传递给 func ,而原始表达式本身只是赋值的一种目标。
但是,您可以写
x["expression"] = func(
(x:=my.object["with_some"].very_long)["expression"],
x["expression"])
x将一个常用表达式的值分配给脱糖版本 my.object["with_some"].very_long .
赋值表达式必须在赋值的右侧,因为它在左侧之前被评估。此外,它必须是使用 := 的第一个参数。 ,因为保证函数参数是从左到右计算的。

这是我用来验证上述是否可行的测试,假设我定义了 A适本地。
class A:
def __init__(self, y):
self.b = dict(foo=y)


def func(x, y):
return x + y


a = A(A("bar"))
x["foo"] = func((x:=a.b["foo"].b)["foo"], x["foo"])
a.b["foo"].b["foo"] 的新值是 "barbar" ,正如 func 的定义所预期的那样.

关于python - 为什么我不能分配给命名表达式(LHS 海象运算符)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65005973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com