python - 为什么不能使用 Python 的海象运算符来设置实例属性?
问题描述
我刚刚了解到新的海象运算符 ( :=
) 不能用于设置实例属性,它应该是无效的语法(引发 a SyntaxError
)。
为什么是这样? (你能提供一个提到这个的官方文档的链接吗?)
我查看了PEP 572,找不到是否/在哪里记录了这一点。
研究
这个答案在没有解释或来源的情况下提到了这个限制:
您不能在对象属性上使用海象运算符
示例代码
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
解决方案
PEP 572 描述了这个目的(强调我的):
这是一个提议,用于创建一种使用符号为表达式中的变量
NAME := expr
赋值的方法。
self.foo
不是变量,它是对象的属性。
语法和语义部分进一步指定它:
NAME
是一个标识符。
self.foo
不是标识符,它是由.
运算符分隔的两个标识符。
虽然我们经常类似地使用变量和属性,有时会草率地将其self.foo
称为变量,但它们并不相同。分配给self.foo
实际上只是一个简写
setattr(self, 'foo', temp)
这就是允许您为属性定义 getter 和 setter 的原因。如果它必须使用具有自定义设置器的属性,它将使赋值表达式的规范和实现变得复杂。
例如,如果 setter 转换了被赋值的值,那么赋值表达式的值应该是原始值还是转换后的值?
另一方面,变量不能自定义。分配给变量始终具有相同的简单语义,并且表达式很容易计算出所分配的值。
同样,您不能将海象运算符与切片分配一起使用。这是无效的:
foo1[2:4] := foo2[1:3]
推荐阅读
- android - 当应用程序处于后台时,Sinch 推送示例无法在 android 8.0 及更高版本上运行
- csv - 在 Neo4j 中导入海量数据集,其中每个实体具有不同的属性
- python - 调用内部类方法时分配不起作用
- c# - Visual Studio 说我试图将 NULL 插入“Cars_details”表的“id”记录中
- scala - Spark 增强 TB 级数据集之间的连接
- php - 如何使用 typeahead bootstrap 和 sql 实现自动完成?
- sed - 如果前面没有另一个模式,则替换第一次出现的模式
- javascript - nestjs multer在multer存储后获取新文件名列表
- ruby-on-rails - 为什么在我的 Rails 应用程序中尝试连接到外部 API 时会收到 401?
- maven - Junit 单独运行良好,但在 maven 构建期间失败,给出 sun.security.provider.certpath.SunCertPathBuilderException