Изначально я пытался определить свой абстрактный клиентский класс API следующим образом (упрощенно, чтобы просто изолировать проблему, с которой я столкнулся):
Код: Выделить всё
from abc import ABC
from typing import Generic, Type, TypeVar
from .endpoints import BaseGenericEndpoint
BaseClientEndpoint = TypeVar('BaseClientEndpoint', bound=BaseGenericEndpoint)
SpecificClientEndpoint = TypeVar('SpecificClientEndpoint',
bound=BaseClientEndpoint)
class APIClient(ABC, Generic[BaseClientEndpoint]):
def __init__(self, *args, **kwargs):
self._endpoint_values: dict[str, BaseClientEndpoint] = {}
def get_endpoint(
self, endpoint_name: str,
endpoint_type: Type[SpecificClientEndpoint]
) -> SpecificClientEndpoint:
if endpoint_name not in self._endpoint_values:
self._endpoint_values[endpoint_name] = endpoint_type()
return self._endpoint_values[endpoint_name]
Я думаю, что смогу найти хитрые способы обойти это (возможно, используя BaseClientEndpoint повсюду, а затем заставив подклассы использовать cast для обеспечения желаемого результата). ), но кажется, то, что я хочу сделать, не так уж и странно, поэтому я чувствую, что должно быть какое-то более элегантное решение, которое я упускаю из виду.
Я искал документы Python и mypy и не дали ответа, и мои исследования в Google также оказались бесплодными. Я видел других людей, которые сталкивались с той же ошибкой, но они пытались добиться чего-то другого, поэтому предложенные им решения неприменимы к моему случаю.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python