Как указать универсальную функцию, которая выполняет динамическое извлечение универсального экземпляра из словаря?Python

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

Сообщение Anonymous »

У меня есть универсальный класс GenericItem, у которого есть имя и переменная типа, которую я хочу использовать в качестве подсказки типа.

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

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
GenericItems хранятся в другом классе: GenericItemStore, который использует dict для хранения пар имя/элемент GenericItem. В примере это упрощено: фактический класс хранит общие объекты Endpoint и имеет внутреннюю функциональность httpx для выполнения запросов API.

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

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
Когда я использую GenericItemStore *some_method_that_need_typehints *Мне хотелось бы иметь подсказку для второго аргумента, но поскольку сигнатура функции определена статически, а фактический универсальный элемент извлекается в теле функции (динамически), он не указывает реальный тип, который я хочу передать.

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

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=...)
Есть ли способ как-то указать этот параметр? Возможно ли это вообще с текущей системой типизации Python, или я просто неправильно понимаю? Может быть, мне стоит полностью изменить способ структурирования этого приложения?
Я пробовал:
  • используя собственный общий реестр вместо dict
  • mypy.cast
Любая помощь приветствуется.

Подробнее здесь: https://stackoverflow.com/questions/787 ... c-instance

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