Сообщить об ошибке.

Класс Type() модуля typing в Python

Типизация переменных, принимающих классы

Синтаксис:

# с версии Python 3.9. импорт из typing устарел;
# используйте стандартный класс `type()`
from typing import Type

Type(Generic[CT_co])

Параметры:

  • Generic[CT_co] - типы из collections.abc, Any и Union любого из этих типов.

Описание:

Переменная с аннотацией 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 "Тип псевдонима".