数据类行为的变化

Jac*_*oge 5 python transcrypt

我正在开发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))
Run Code Online (Sandbox Code Playgroud)

用于打印(使用 CPython):

Test(x=20, y=10)
Run Code Online (Sandbox Code Playgroud)

但是随着它打印的发布(再次仅使用 CPython):

Test(y=10)
Run Code Online (Sandbox Code Playgroud)

所以它从表示中遗漏了类变量 x。谁能告诉我这个改变是否是故意的,我在哪里可以找到证明它合理的讨论?

有了这个变化,Transcrypt 的行为与 CPython 不同,这是我不想要的。所以我想知道我应该采用 Transcrypt 还是应该将其视为 CPython 回归并等待它被解决。

jas*_*per 5

文档

30.6.3. 类变量

dataclass()实际检查字段类型的两个地方之一是确定字段是否是PEP 526 中定义的类变量。它通过检查字段的类型是否为typing.ClassVar. 如果字段是 a ClassVar,则将其作为字段排除在外,并被数据类机制忽略。ClassVar模块级fields()函数不返回此类伪字段 。

所以,这似乎是一个有意的改变。