Как аннотировать функцию, возвращающую поле класса данных, чтобы средства проверки типов правильно ее обрабатывали?Python

Программы на Python
Ответить
Anonymous
 Как аннотировать функцию, возвращающую поле класса данных, чтобы средства проверки типов правильно ее обрабатывали?

Сообщение Anonymous »

Сейчас я работаю над библиотекой, которая использует классы dataclasses.dataclass для структур данных. Я использую аргумент metadata метода dataclasses.field() для внедрения информации о пользовательской библиотеке, которая оценивается позже. Чтобы добавить синтаксический сахар, я создал функции, которые действуют как оболочка dataclasses.field() для внедрения необходимых метаданных «в фоновом режиме», поскольку пользователям моей библиотеки не нужно беспокоиться об этих деталях реализации.
Однако я изо всех сил пытаюсь осмыслить «магию», которая происходит в классах данных, особенно в отношении проверки типов. Рассмотрим следующий упрощенный пример:

Код: Выделить всё

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)
# )
Мне хотелось бы, чтобы мой метод custom_field() был «прозрачным» для проверки типов. Он возвращает результат dataclasses.field(), тот факт, что он вводит метаданные, не имеет значения для целей проверки типов. Однако, по крайней мере, средство проверки типов, которое я использую (расширение Pylance для Visual Studio Code), похоже, не обнаруживает это автоматически.
Фактически, средство проверки типов указывает c в качестве возможного аргумента при вызове CustomDataClass.__init__(), но это ошибка. Попытка предоставить c в качестве третьего позиционного аргумента вызовет SyntaxError, поскольку созданный во время выполнения конструктор класса данных имеет параметры только для полей a и b, поскольку поле c исключено из конструктора через init=False.
Как я могу аннотировать этот код таким образом, чтобы средства проверки типов обрабатывали его так же, как они обрабатывают использование dataclasses.field() напрямую?

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-checkers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»