Код: Выделить всё
import abc
from typing import TypeVar, Generic, Union
from pydantic import BaseModel
T = TypeVar('T')
class Data(BaseModel, abc.ABC, Generic[T]):
def handle(self, data: T) -> None:
raise NotImplementedError()
class StringData(Data[str]):
name: str = "string"
def handle(self, data: str) -> None:
print("String data:", data)
class IntData(Data[int]):
name: str = "int"
def handle(self, data: int) -> None:
print("Int data:", data)
Обратите внимание, что я должен использовать Union вместо абстрактного класса, чтобы model_dump_json действительно давал правильный результат. Это не идеально, но, похоже, другого выхода нет.
Код: Выделить всё
U = TypeVar('U')
class DataManager(BaseModel, Generic[U]):
my_data: Union[StringData, IntData] # Good
my_data: Data # NOT GOOD!
Код: Выделить всё
class DataManager(BaseModel, Generic[U]):
my_data: Union[StringData, IntData]
def handle(self, data: U) -> None:
self.my_data.handle(data)
class StringDataManager(DataManager[str]):
pass
StringDataManager(my_data=StringData()).handle(data="some-string")
Аргумент 1 для «дескриптора» «StringData» имеет несовместимый тип «U»; ожидается "str" [arg-type]
Аргумент 1 для "дескриптора" "IntData" имеет несовместимый тип "U"; ожидается "int" [тип-аргумента]
Подробнее здесь: https://stackoverflow.com/questions/798 ... avoid-mypy
Мобильная версия