【发布时间】:2020-09-24 22:33:54
【问题描述】:
我刚刚了解到新的海象运算符 (:=) 不能用于设置实例属性,它应该是无效的语法(引发 SyntaxError)。
为什么会这样?(你能提供一个提到这个的官方文档的链接吗?)
我查看了 PEP 572,但找不到是否/在哪里记录了这一点。
研究
This answer 在没有解释或来源的情况下提到了这个限制:
您不能在对象属性上使用海象运算符
示例代码
class Foo:
def __init__(self):
self.foo: int = 0
def bar(self, value: int) -> None:
self.spam(self.foo := value) # Invalid syntax
def baz(self, value: int) -> None:
self.spam(temp := value)
self.foo = temp
def spam(self, value: int) -> None:
"""Do something with value."""
尝试导入Foo 会导致SyntaxError:
self.spam(self.foo := value)
^
SyntaxError: cannot use assignment expressions with attribute
【问题讨论】:
-
@SuperStew 你能解释一下原因吗?
-
@SuperStew 有时坏事是两害相权取其轻。我发现 PEP 572 中的示例令人信服
-
@jtbandes 似乎与 python 的禅宗背道而驰
-
我怀疑这是因为对属性的赋值实际上是变相的方法调用,并且可能具有隐藏的副作用。对名称的纯赋值是不行的。
-
“我不喜欢海象操作员”是一个公平的说法。 “海象操作员很糟糕并且你应该感觉很糟糕”是另一回事。我们不要忘记,海象运算符经过了许多 Python 专家的严格审查和讨论,他们对 Python 的禅宗对语言的意义有着强烈、完善的看法。不同意他们是好的,但告诉随机的人因为这种分歧而感到难过是不好的。
标签: python syntax-error python-3.8 walrus-operator