В разделе рассмотрены функции, которые помогают провести самоанализ проведенной типизации исходного кода программистом.
typing.get_type_hints()
возвращает словарь, содержащий подсказки типов,typing.get_args()
самоанализ общих типов и специальных форм,typing.get_origin()
самоанализ общих типов и специальных форм,typing.TYPE_CHECKING
специальная константа.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__
. Это делает ненужным использование кавычек вокруг аннотации.