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

Помощники самоанализа модуля typing в Python

В разделе рассмотрены функции, которые помогают провести самоанализ проведенной типизации исходного кода программистом.

Содержание:


typing.get_type_hints(obj, globalns=None, localns=None, include_extras=False):

Функция typing.get_type_hints() возвращает словарь, содержащий подсказки типов для функции, метода, модуля или объекта класса.

Часто это то же самое, что и obj.__annotations__. Кроме того, прямые ссылки, закодированные как строковые литералы, обрабатываются путем их оценки в глобальных и локальных пространствах имен. При необходимости для аннотаций функций и методов добавляется Optional[t], если задано значение по умолчанию, равное None. Для класса C вернет словарь, созданный путем объединения всех __annotations__ по C.__mro__ в обратном порядке.

Функция рекурсивно заменяет все Annotated[T, ...] на T, если для include_extras не установлено значение True (смотрите тип аннотации Annotated для получения дополнительной информации).

Например:

class Student(NamedTuple):
    name: Annotated[str, 'some marker']

get_type_hints(Student) == {'name': str}
get_type_hints(Student, include_extras=False) == {'name': str}
get_type_hints(Student, include_extras=True) == {
    'name': Annotated[str, 'some marker']
}

Изменено в Python 3.9: добавлен параметр include_extras

Изменено в версии 3.11: ранее для аннотаций функций и методов добавлялся Optional[t], если было установлено значение по умолчанию, равное None. Теперь аннотация возвращается без изменений.

typing.get_args(tp):
typing.get_origin(tp):

Функция typing.get_origin() обеспечивает базовый самоанализ для общих типов и специальных форм ввода.

Для типизирующего объекта формы X[Y, Z, ...] обе функции возвращают X и кортеж (Y, Z, ...). Если X является общим псевдонимом для встроенного класса или класса коллекций, то он нормализуется до исходного класса. Если X является Union или Literal, содержащимся в другом общем типе, то порядок (Y, Z, ...) может отличаться от порядка исходных аргументов [Y, Z, ...] из-за кэширования типов. Для неподдерживаемых объектов возвращает None и () соответственно.

Примеры:

assert get_origin(Dict[str, int]) is dict
assert get_args(Dict[int, str]) == (int, str)

assert get_origin(Union[int, str]) is Union
assert get_args(Union[int, str]) == (int, str)

Новое в Python 3.8.

Константа модуля

typing.TYPE_CHECKING:

Специальная константа typing.TYPE_CHECKING, которая предполагается равной True для программами проверки статических типов и равна False во время выполнения программы.

Применение:

if TYPE_CHECKING:
    import expensive_mod

def fun(arg: 'expensive_mod.SomeType') -> None:
    local_var: expensive_mod.AnotherType = other_fun()

Аннотации первого типа должны быть заключены в кавычки, что делает их "прямой ссылкой", чтобы скрыть ссылку expensive_mod от среды выполнения интерпретатора. Аннотации типов для локальных переменных не оцениваются, поэтому вторую аннотацию не нужно заключать в кавычки.

Примечание. Если аннотации импорта from __future__ используются в Python 3.7 или новее, аннотации не оцениваются во время определения функции, а хранятся в виде строк в __annotations__. Это делает ненужным использование кавычек вокруг аннотации.