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

Тип аннотации TypeVar модуля typing в Python.

Типизация нескольких принимаемых значений типов переменных.

Не используется в аннотациях, являются строительным блоком для создания универсальных типов.

Синтаксис:

from typing import TypeVar

A = TypeVar['A', str, bytes]

Параметры:

  • A - имя переменной
  • str, bytes - принимаемые значения типов переменных.

Описание:

Тип аннотации TypeVar() модуля typing представляет собой - возможные типы переменных.

Использование:

T = TypeVar('T')  # Может быть что угодно
A = TypeVar('A', str, bytes)  # Должно быть `str` или `bytes`

Типы переменных TypeVar существуют в первую очередь для целей проверки статических типов. Они служат параметрами для универсальных типов, а также для определений универсальных функций. Для получения дополнительной информации об универсальных типах, смотрите описание типа аннотации typing.Generic.

Универсальные функции работают следующим образом:

def repeat(x: T, n: int) -> Sequence[T]:
    """Возвращает список, содержащий n ссылок на x."""
    return [x]*n

def longest(x: A, y: A) -> A:
    """Возвращает самую длинную из двух строк."""
    return x if len(x) >= len(y) else y

Сигнатура последнего примера - это, по сути, перегрузка (str, str) -> str и (bytes, bytes) -> bytes. Также обратите внимание, что если аргументы являются экземплярами некоторого подкласса str, возвращаемый тип по-прежнему будет обычным str.

Во время выполнения, isinstance(x, T) вызовет TypeError. В общем случае isinstance() и issubclass() не следует использовать с типами.

Переменные типов TypeVar могут быть помечены как ковариантные или контравариантные, если передать covariant=True или Contravariant=True. По умолчанию типы переменных неизменны. В качестве альтернативы, типы переменных могут указывать верхнюю границу с помощью параметра bound=type. Это означает, что фактический тип, замененный (явно или неявно) должен быть подклассом граничного типа.