Я видел в документации Python общий синтаксис после версии 3.12:
Эквивалент:
Код: Выделить всё
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()
Другими словами, новый общий синтаксис — это всего лишь синтаксический сахар. Компилятор Python преобразует новый общий синтаксис в форму, аналогичную приведенной выше, или обертывает его аналогичной формой других функций. Фактически, окончательный код для создания дженериков по-прежнему выглядит так: class Bag(typing.Generic[T]).
- 3.12 и 3.13
Код: Выделить всё
class MyClass[T]: pass
print(MyClass.__mro__)
- 3.11
Код: Выделить всё
import typing as t
T = t.TypeVar('T')
class MyClass2(t.Generic[T]): pass
print(MyClass2.__mro__)
Результаты обоих одинаковы:
В PEP 695 новый общий синтаксис предназначен для решения проблемы путаницы, вызванной распространением глобальных переменных типа T=typing.TypeVar('t') . Таким образом, новый общий синтаксис будет переведен в форму, заключенную в функцию и созданную внутри функции, а также будут созданы «существительное» и «области аннотаций».
Итак, правильный ли класс MyClass[T] == class MyClass(t.Generic[T])?
Подробнее здесь:
https://stackoverflow.com/questions/793 ... n-generics