Как указать универсальную функцию, которая выполняет динамическое извлечение универсального экземпляра из словаря?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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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