python - 数据类行为的变化
问题描述
我正在开发Transcrypt Python to JavaScript 编译器的 3.7.1 版。发布过程的一部分是出货测试,其中 Transcrypt 使用 CPython 背靠背进行测试。
它过去可以在 CPython 3.7 的 beta 版本中完美运行,但在发布时出现了问题。
该程序:
from dataclasses import dataclass
from typing import ClassVar
@dataclass
class Test:
x: ClassVar = 10
y: int = 10
t = Test ()
t.x = 20
print (repr (t))
用于打印(使用 CPython):
Test(x=20, y=10)
但随着发布它打印(再次仅使用 CPython):
Test(y=10)
所以它从表示中省略了类变量 x。谁能告诉我这种改变是否是故意的,我在哪里可以找到证明它合理的讨论?
随着这一变化,Transcrypt 的行为与我不想要的 CPython 不同。所以我想知道我应该适应 Transcrypt 还是应该考虑这是一个 CPython 回归并等待它被解决。
解决方案
从文档中:
30.6.3。类变量
实际检查字段类型的两个地方
dataclass()
之一是确定字段是否是PEP 526中定义的类变量。它通过检查字段的类型是否为 来做到这一点typing.ClassVar
。如果字段是 aClassVar
,则将其作为字段排除在外,并被数据类机制忽略。ClassVar
模块级fields()
函数不返回此类伪字段。
所以,这似乎是一个有意的改变。
推荐阅读
- javascript - 如何从对象数组中获取唯一的日期值
- haskell - 为什么我会收到解析错误,如何在 haskell 中解决此错误?
- amazon-web-services - 在 AWS CodePipeline 中为蓝/绿部署指定 AWS CodeDeploy 目标实例
- java - java.lang.Error:致命异常 Google Play Android 10
- javascript - jQuery ajax 输入字段事件、选项列表和设置值
- python - 从一个表中选择在另一个表中具有相似数据的数据
- docker - 为什么 docker exec 不返回?
- azure - azure function V2 c# scipt - 从 azure 表中获取实体
- mysql - Mysql 查询每个条件只提供一个(最高等级)
- pip - 无法在 Colab 上永久安装 Fastai 库