Код: Выделить всё
from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T", bound=BaseModel)
class GenericItem(Generic[T]):
def __init__(self, name: str, type_that_i_need_in_typehint: type[T] | None) -> None:
self.name: str = name
self.type_: type[T] | None = type_that_i_need_in_typehint
Код: Выделить всё
class GenericItemStore:
def __init__(self, items: list[GenericItem[T]]) -> None:
self.generic_items_registry: dict[str, GenericItem[T]] = {}
self._configure_registry(items)
def _configure_registry(self, items: list[GenericItem[T]]) -> None:
for item in items:
self.generic_items_registry[item.name] = item
def get_from_registry(self, name: str) -> GenericItem[T]:
return self.generic_items_registry[name]
def some_method_that_need_typehints(self, name: str, actual_instance_of_type: T) -> None:
generic_item: GenericItem[T] = self.get_from_registry(name)
# there goes other processing
return None
Код: Выделить всё
class BaseModelSubclass(BaseModel):
some_param: int
generic_item_store = GenericItemStore(
items=[
GenericItem(name="First", type_that_i_need_in_typehint=BaseModelSubclass),
GenericItem(name="Second", type_that_i_need_in_typehint=None),
]
)
# actual_instance_of_type is type hinted by PyCharm as T because it's a static func signature
# I want it to be typehinted as BaseModelSubclass but don't know how and if it's even possible
generic_item_store.some_method_that_need_typehints("First", actual_instance_of_type=...)
Я пробовал:
- используя собственный общий реестр вместо dict
- mypy.cast
Подробнее здесь: https://stackoverflow.com/questions/787 ... c-instance