首页 > 解决方案 > 数据类行为的变化

问题描述

我正在开发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 回归并等待它被解决。

标签: pythontranscrypt

解决方案


文档中

30.6.3。类变量

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

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


推荐阅读