Аннотация универсальных классов объявляются следующим образом:
Новое в Python 3.12.
class Bag[T]: ...
Этот синтаксис эквивалентен:
annotation-def TYPE_PARAMS_OF_Bag(): T = typing.TypeVar("T") class Bag(typing.Generic[T]): __type_params__ = (T,) ... return Bag Bag = TYPE_PARAMS_OF_Bag()
Здесь определение annotation-def
(не реальное ключевое слово) указывает на область действия аннотации, которая фактически не привязана ни к какому имени во время выполнения программы. Следовательно и имя TYPE_PARAMS_OF_Bag
фактически не привязано во время выполнения.
Универсальные классы неявно наследуются от typing.Generic
. Базовые классы и ключевые аргументы универсальных классов оцениваются в области видимости типа для параметров типа, а декораторы оцениваются за пределами этой области. Это иллюстрируется этим примером:
@decorator class Bag(Base[T], arg=T): ...
Это эквивалентно:
annotation-def TYPE_PARAMS_OF_Bag(): T = typing.TypeVar("T") class Bag(Base[T], typing.Generic[T], arg=T): __type_params__ = (T,) ... return Bag Bag = decorator(TYPE_PARAMS_OF_Bag())
Дополнительно смотрите материал "Синтаксис аннотации универсальных функций".
Новое в Python 3.12.