Python 3.12+Аннотации и typingконструкция
Параметры типа [T]
синтаксис
def f[T](x: T) -> T и class Box[T] объявляют обобщённые функции и классы прямо в заголовке, без TypeVar и Generic (Python 3.12+).
Синтаксис
def имя[T](x: T) -> T: ...
class Имя[T]: ...
class Имя[T: Ограничение, *Ts, **P]: ...
Главная ловушка: T видно только внутри своей функции или класса — снаружи это NameError, а не общая переменная модуля, как при T = TypeVar('T'). Тип во время выполнения не проверяется: first(['a']) отработает, как бы ни была аннотирована функция. Значения по умолчанию [T = int] появились только в 3.13; для старых версий остаются TypeVar и Generic[T].
Примеры
# Python 3.12+
def first[T](items: list[T]) -> T:
return items[0]
print(first([3, 1])) # → 3
print(first.__type_params__) # → (T,)
print(T) # → NameError
# Python 3.12+
class Box[T]:
def __init__(self, item: T):
self.item = item
print(Box[int]) # → __main__.Box[int]
print(Box('a').item) # → a — тип не проверяется
# Python 3.13+
class Box[T = int]:
pass
print(Box.__type_params__[0].__default__) # → <class 'int'>
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности