Согласно PEP-526 (https://peps.python.org/pep-0526/#class-and-instance-variable-annotations)
Переменная типа не может находиться внутри аргумента ClassVar независимо от глубины вложенности: если T обозначает переменную типа, то недопустимы и ClassVar[T], и ClassVar[List[Set[T]]].
Почему существует такое ограничение? Сам PEP этого не объясняет; возможно, ответ есть где-нибудь в архивах Typing github…
Я столкнулся с этим, аннотируя обобщённый базовый класс с парой членов: атрибут экземпляра хранит экземпляр определённого типа, а атрибут класса хранит сам этот тип:
class _TransportBase[Conn: (httpx.Client, httpx.AsyncClient), Cred: httpx.Auth](ABC):
base_url: str
connection: Conn
_credential: Cred
_credential_type: ClassVar[Type] # intended as ClassVar[Type[Cred]]
@property
def credential(self) -> Cred:
return self._credential
@credential.setter
@abstractmethod
def credential(self, incoming: Any):
if not isinstance(incoming, self._credential_type):
self._credential = self._credential_type(incoming)
else:
self._credential = incoming
Из-за такого ограничения ClassVar приходится выбирать между явным обозначением атрибута как принадлежащего классу и выражением связи его типа с типом _credential.
Это ранний набросок, который при доработке наверняка изменится. Буду рад предложениям, но сам вопрос здесь касается ClassVar.