Использование программно созданного типа в подсказках по типамPython

Программы на Python
Anonymous
Использование программно созданного типа в подсказках по типам

Сообщение Anonymous »

По некоторым внешним причинам я динамически генерирую набор классов данных с помощью make_dataclass. В других частях моей кодовой базы я хочу использовать эти типы в подсказках типов. Но и mypy, иpyright жалуются.

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

$ pyright dynamic_types.py
/home/user/testing/dynamic_types.py
/home/user/testing/dynamic_types.py:23:18 - error: Variable not allowed in type expression (reportInvalidTypeForm)
1 error, 0 warnings, 0 informations
$ mypy dynamic_types.py
dynamic_types.py:23: error: Variable "dynamic_types.mydc" is not valid as a type  [valid-type]
dynamic_types.py:23: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
Found 1 error in 1 file (checked 1 source file)
Я понимаю аргумент, но в моем случае «динамическая» часть — это словарь внутри того же модуля. Есть ли способ заставить это работать?
MWE:

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

from dataclasses import asdict, field, make_dataclass

class Base:
def my_method(self):
pass

spec = {
"kind_a": [("foo", int, field(default=None)), ("bar", str, field(default=None))]
}

def make_mydc(kind: str) -> type:
"""Create dataclass from list of fields and types."""
fields = spec[kind]
return make_dataclass("mydc_t", fields, bases=(Base,))

mydc = make_mydc("kind_a")

def myfunc(data: mydc):
print(asdict(data))

data = mydc(foo=42, bar="test")
myfunc(data)
ПРИМЕЧАНИЕ. Я не могу использовать Base для ввода подсказки, поскольку у нее нет всех атрибутов.


Подробнее здесь: https://stackoverflow.com/questions/786 ... type-hints

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