Python Glossary English

Python 3.12+Аннотации и typingконструкция

Оператор type

синтаксис

type X = ... объявляет псевдоним типа (Python 3.12+). Правая часть вычисляется лениво, поэтому может ссылаться на ещё не определённые имена.

Синтаксис

type Имя = выражение
type Имя[T] = выражение

Главная ловушка: type создаёт не сам тип, а объект TypeAliasType — isinstance(x, Point) даёт TypeError, а сам тип лежит в Point.__value__. Правая часть вычисляется лениво, при первом обращении к __value__, поэтому опечатка в ней всплывёт NameError не на строке type, а позже. Простое присваивание Point = tuple[float, float] даёт обычный объект без ленивости, но и его isinstance не примет — параметризованный тип проверке экземпляра не годится; type нужен для явных, рекурсивных и обобщённых псевдонимов.

Примеры

# Python 3.12+
type Point = tuple[float, float]
print(type(Point).__name__)  # → TypeAliasType
print(Point.__value__)  # → tuple[float, float]
isinstance((1.0, 2.0), Point)  # → TypeError
Pair = tuple[float, float]   # простое присваивание, без type
print(Pair)  # → tuple[float, float]
isinstance((1.0, 2.0), Pair)  # → TypeError — параметризованный тип проверке не годится
# Python 3.12+
type Later = Undefined
print(Later.__name__)  # → Later
print(Later.__value__)  # → NameError
# Python 3.12+
type Tree = list[Tree] | int
print(Tree.__value__ == (list[Tree] | int))  # → True

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности