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Сообщить о неточности