数据类行为的变化

Change in behaviour of dataclasses

我正在开发 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)

所以它从表示中省略了 class 变量 x。 任何人都可以告诉我这个改变是否是故意的, 我在哪里可以找到证明它合理的讨论?

通过此更改,Transcrypt 的行为不同于 CPython,这是我不想要的。 所以我想知道我应该采用 Transcrypt 还是应该将其视为 CPython 回归并等待它被解决。

来自the documentation

30.6.3. Class variables

One of two places where dataclass() actually inspects the type of a field is to determine if a field is a class variable as defined in PEP 526. It does this by checking if the type of the field is typing.ClassVar. If a field is a ClassVar, it is excluded from consideration as a field and is ignored by the dataclass mechanisms. Such ClassVar pseudo-fields are not returned by the module-level fields() function.

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