我正在研究Transcrypt Python到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回归并等待其解决。
答案 0 :(得分:4)
30.6.3。类变量
dataclass()
实际上检查两个类型的两个位置之一 field用于确定字段是否为PEP 526中定义的类变量。它通过检查字段的类型是否为typing.ClassVar
来完成此操作。如果字段是ClassVar
,则将其排除在外 考虑作为一个字段,并被数据类机制忽略。 模块级别不返回此类ClassVar
伪字段fields()
功能。
因此,这似乎是有意更改。