Сообщить об ошибке.

Определение универсальных классов в Python

Аннотация универсальных классов объявляются следующим образом:

Новое в 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.