Изменение в поведении классов данных - PullRequest
0 голосов
/ 30 августа 2018

Я работаю над выпуском 3.7.1 Transcrypt компилятора Python to JavaScript. Частью процедуры выпуска является тест на отгрузку, в котором Transcrypt тестируется совместно с CPython.

Раньше он работал безупречно с бета-версией CPython 3.7, но с релизом есть проблема.

Программа:

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 и ждать, пока она не будет решена.

1 Ответ

0 голосов
/ 30 августа 2018

С документация :

30.6.3. Переменные класса

Одно из двух мест, где dataclass() фактически проверяет тип поле должно определить, является ли поле переменной класса, как определено в PEP 526 . Это делается путем проверки, является ли тип поля typing.ClassVar. Если поле является ClassVar, оно исключается из рассматривается как поле и игнорируется механизмами классов данных. Такие ClassVar псевдополя не возвращаются уровнем модуля fields() функция.

Итак, похоже, это преднамеренное изменение.

...