数据类行为的变化
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 回归并等待它被解决。
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.
所以,这似乎是一个有意的改变。
我正在开发 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 回归并等待它被解决。
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 istyping.ClassVar
. If a field is aClassVar
, it is excluded from consideration as a field and is ignored by the dataclass mechanisms. SuchClassVar
pseudo-fields are not returned by the module-levelfields()
function.
所以,这似乎是一个有意的改变。