В разделе рассмотрены функции, которые помогают провести самоанализ проведенной типизации исходного кода программистом.
typing.get_type_hints()
возвращает словарь, содержащий подсказки типов,typing.get_args()
самоанализ общих типов и специальных форм,typing.get_origin()
самоанализ общих типов и специальных форм,typing.get_protocol_members()
возвращает набор элементов, определенных в протоколе (новое в Python 3.13),typing.is_protocol()
определяет, является ли тип протоколом (новое в Python 3.13),typing.is_typeddict()
определяет, является ли тип TypedDict
(новое в Python 3.10),typing.ForwardRef()
используется для внутреннего представления типизации прямых ссылок на строки,typing.NoDefault()
используется для указания того, что параметр типа не имеет значения по умолчанию (новое в Python 3.13),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.get_protocol_members(tp)
:Добавлено в Python 3.13.
Функция typing.get_protocol_members()
возвращает набор элементов, определенных в протоколе.
Вызывает исключение TypeError
для аргументов, которые не являются протоколами.
from typing import Protocol, get_protocol_members class P(Protocol): def a(self) -> str: ... b: int >>> get_protocol_members(P) == frozenset({'a', 'b'}) # True
typing.is_protocol(tp)
:Добавлено в Python 3.13.
Функция typing.is_protocol()
определяет, является ли тип протоколом.
Пример:
class P(Protocol): def a(self) -> str: ... b: int is_protocol(P) # => True is_protocol(int) # => False
typing.is_typeddict(tp)
:Добавлено в Python 3.10.
Функция typing.is_typeddict()
определяет, является ли тип TypedDict
.
Пример:
class Film(TypedDict): title: str year: int assert is_typeddict(Film) assert not is_typeddict(list | str) # TypedDict is a factory for creating typed dicts, # not a typed dict itself assert not is_typeddict(TypedDict)
typing.ForwardRef
:Класс typing.ForwardRef
используется для внутреннего представления типизации прямых ссылок на строки.
Например, List['SomeClass']
неявно преобразуется в List[ForwardRef('SomeClass')]
. ForwardRef
не должен создаваться пользователем, но может использоваться инструментами самоанализа.
Примечание. Общие типы PEP 585, такие как
list['SomeClass']
не будут неявно преобразованы вlist[ForwardRef('SomeClass')]
и, следовательно, не будут автоматически разрешаться вlist[SomeClass]
.
typing.NoDefault
:Добавлено в Python 3.13.
Дозорный объект typing.NoDefault
, используемый для указания того, что параметр типа не имеет значения по умолчанию. Например:
>>> T = TypeVar("T") >>> T.__default__ is typing.NoDefault # True >>> S = TypeVar("S", default=None) >>> S.__default__ is None # True
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__
. Это делает ненужным использование кавычек вокруг аннотации.