Однако я изо всех сил пытаюсь осмыслить «магию», которая происходит в классах данных, особенно в отношении проверки типов. Рассмотрим следующий упрощенный пример:
Код: Выделить всё
from dataclasses import dataclass, field
@dataclass
class NormalDataClass():
a : str
b : int
c : int = field(init=False)
# Type checker shows for NormalDataClass():
# class NormalDataClass(
# a: str,
# b: int
# )
def custom_field(*args, **kwargs):
return field(*args, **kwargs, metadata={'example_metadata': 42})
@dataclass
class CustomDataClass():
a : str
b : int
c : int = custom_field(init=False)
# Type checker shows for CustomDataClass():
# class CustomDataClass(
# a: str,
# b: int,
# c: int = custom_field(init=False)
# )
Фактически, средство проверки типов указывает c в качестве возможного аргумента при вызове CustomDataClass.__init__(), но это ошибка. Попытка предоставить c в качестве третьего позиционного аргумента вызовет SyntaxError, поскольку созданный во время выполнения конструктор класса данных имеет параметры только для полей a и b, поскольку поле c исключено из конструктора через init=False.
Как я могу аннотировать этот код таким образом, чтобы средства проверки типов обрабатывали его так же, как они обрабатывают использование dataclasses.field() напрямую?
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-checkers
Мобильная версия