# с версии Python 3.9. импорт из typing устарел; # используйте стандартный класс `type()` from typing import Type Type(Generic[CT_co])
Переменная с аннотацией C
может принимать значение типа C
. Напротив, переменная, аннотированная классом Type[C]
, может принимать значения, которые сами являются классами - в частности, она принимает объект класса C
.
Например:
a = 3 # Имеет тип 'int' b = int # Имеет тип 'Type[int]' c = type(a) # Также имеет 'Type[int]'
Обратите внимание, что type[C]
является ковариантным:
class User: ... class BasicUser(User): ... class ProUser(User): ... class TeamUser(User): ... # Принимает User, BasicUser, ProUser, TeamUser, ... def make_new_user(user_class: type[User]) -> User: # ... return user_class()
Тот факт, что type[C]
является ковариантным, подразумевает, что все подклассы C
должны реализовывать ту же сигнатуру конструктора и сигнатуры методов класса, что и C
. Средство проверки типизации должно отмечать нарушения этого, но также должно разрешать вызовы конструкторов в подклассах, которые соответствуют вызовам конструктора в указанном базовом классе. То, как для инструментов проверки типов требуется обработать этот конкретный случай, может измениться в будущих версиях.
Единственными допустимыми параметрами для type
являются классы, Any
, типы из collections.abc
и объединения Union
любого из этих типов.
Например:
def new_non_team_user(user_class: type[Union[BasicUser, ProUser]]): ...
Type[Any]
эквивалентен Type
, который, в свою очередь, эквивалентен type
, который является корнем иерархии метаклассов Python.
Не рекомендуется с Python 3.9: встроенный класс type()
теперь поддерживает синтаксис аннотаций []
.
Дополнительно смотрите встроенный в Python "Тип псевдонима".