Перейти к содержимому

inspect – Инспекция живых объектов

Исходный код: Lib/inspect.py


Модуль inspect предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, с его помощью можно изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов функции или получить всю необходимую информацию для отображения подробной трассировки.

Модуль предоставляет четыре основных вида функций: проверка типов, получение исходного кода, интроспекция классов и функций, а также анализ стека интерпретатора.

Types and membersТипы и члены

Функция getmembers() извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются как удобные варианты для второго аргумента getmembers(). Они также помогают определить, когда можно ожидать следующие специальные атрибуты (см. Атрибуты модуля, связанные с импортом для атрибутов модуля):

Тип

Атрибут

Описание

class

doc

строка документации

name

имя, под которым определён класс

qualname

квалифицированное имя

module

имя модуля, в котором был определён класс

type_params

Кортеж, содержащий параметры типа обобщённого класса

method

doc

строка документации

name

имя, с которым был определён этот метод

qualname

полное имя

func

объект функции, содержащий реализацию метода

self

экземпляр, к которому привязан этот метод, или None

module

имя модуля, в котором был определён этот метод

функция

doc

строка документации

name

имя, с которым была определена эта функция

qualname

полное имя

code

объект кода, содержащий скомпилированную функцию байткод

defaults

кортеж значений по умолчанию для позиционных или именованных параметров

kwdefaults

отображение значений по умолчанию для параметров, передаваемых только по ключу

globals

глобальное пространство имён, в котором была определена эта функция

builtins

пространство имён builtins

annotations

отображение имён параметров на аннотации; ключ "return" зарезервирован для аннотаций возвращаемого значения.

type_params

Кортеж, содержащий параметры типа обобщённой функции

module

имя модуля, в котором была определена эта функция

traceback

tb_frame

объект фрейма на этом уровне

tb_lasti

индекс последней предпринятой инструкции в байт-коде

tb_lineno

текущий номер строки в исходном коде Python

tb_next

следующий внутренний объект traceback (вызванный этим уровнем)

frame

f_back

следующий внешний объект фрейма (вызывающий этот фрейм)

f_builtins

пространство имён builtins, видимое этим фреймом

f_code

объект кода, выполняемый в этом фрейме

f_globals

глобальное пространство имён, видимое этим фреймом

f_lasti

индекс последней предпринятой инструкции в байт-коде

f_lineno

текущий номер строки в исходном коде Python

f_locals

локальное пространство имён, видимое этим фреймом

f_generator

возвращает объект генератора или корутины, которому принадлежит этот фрейм, или None, если фрейм принадлежит обычной функции

f_trace

функция трассировки для этого фрейма или None

f_trace_lines

указывает, запускается ли событие трассировки для каждой строки исходного кода

f_trace_opcodes

указывает, запрашиваются ли события для каждой операции (per-opcode)

clear()

используется для удаления всех ссылок на локальные переменные

code

co_argcount

количество аргументов (без учёта только именованных аргументов и аргументов * или **)

co_code

строка с сырым скомпилированным байт-кодом

co_cellvars

кортеж имён переменных ячейки (на которые ссылаются объемлющие области видимости)

co_consts

кортеж констант, используемых в байт-коде

co_filename

имя файла, в котором был создан этот объект кода

co_firstlineno

номер первой строки в исходном коде Python

co_flags

битовая маска флагов CO_*, подробнее здесь

co_lnotab

закодированное отображение номеров строк на индексы байт-кода

co_freevars

кортеж имён свободных переменных (на которые ссылаются через замыкание функции)

co_posonlyargcount

количество только позиционных аргументов

co_kwonlyargcount

количество только именованных аргументов (не считая **arg)

co_name

имя, с которым был определён этот объект кода

co_qualname

полное квалифицированное имя, с которым был определён этот объект кода

co_names

кортеж имён, отличных от аргументов и локальных переменных функции

co_nlocals

количество локальных переменных

co_stacksize

требуемый размер стека виртуальной машины

co_varnames

кортеж имён аргументов и локальных переменных

co_lines()

возвращает итератор, который порождает последовательные диапазоны байт-кода

co_positions()

возвращает итератор позиций исходного кода для каждой инструкции байт-кода

replace()

возвращает копию объекта кода с новыми значениями

генератор

name

имя

qualname

квалифицированное имя

gi_frame

фрейм

gi_running

запущен ли генератор?

gi_suspended

приостановлен ли генератор?

gi_code

код

gi_yieldfrom

объект, по которому выполняется итерация с помощью yield from, или None

gi_state

состояние генератора: GEN_CREATED, GEN_RUNNING, GEN_SUSPENDED или GEN_CLOSED

асинхронный генератор

name

имя

qualname

квалифицированное имя

ag_await

объект, который ожидается, или None

ag_frame

фрейм

ag_running

работает ли генератор?

ag_suspended

приостановлен ли генератор?

ag_code

код

ag_state

состояние асинхронного генератора: AGEN_CREATED, AGEN_RUNNING, AGEN_SUSPENDED или AGEN_CLOSED

корутина

name

имя

qualname

квалифицированное имя

cr_await

объект, который ожидается, или None

cr_frame

фрейм

cr_running

работает ли корутина?

cr_suspended

приостановлена ли корутина?

cr_code

код

cr_origin

где была создана корутина, или None. См. sys.set_coroutine_origin_tracking_depth()

cr_state

состояние корутины, одно из CORO_CREATED, CORO_RUNNING, CORO_SUSPENDED или CORO_CLOSED

builtin

doc

строка документации

name

исходное имя этой функции или метода

qualname

полное имя

self

экземпляр, к которому привязан метод, или None

Изменено в версии 3.5: Добавлены атрибуты __qualname__ и gi_yieldfrom к генераторам.

Атрибут __name__ генераторов теперь устанавливается из имени функции, а не из имени кода, и его теперь можно изменять.

Изменено в версии 3.7: Добавлен атрибут cr_origin к корутинам.

Изменено в версии 3.10: Добавлен атрибут __builtins__ к функциям.

Изменено в версии 3.11: Добавлен атрибут gi_suspended к генераторам.

Изменено в версии 3.11: Добавлен атрибут cr_suspended к корутинам.

Изменено в версии 3.12: Добавлен атрибут ag_suspended к асинхронным генераторам.

Изменено в версии 3.14: Добавлен атрибут f_generator к фреймам.

Изменено в версии 3.15: Добавлен атрибут gi_state к генераторам, атрибут cr_state к корутинам и атрибут ag_state к асинхронным генераторам.

inspect.getmembers(object[, predicate])

Возвращает все члены объекта в виде списка кортежей (name, value) отсортированных по имени. Если передан необязательный аргумент predicate, который будет вызван с объектом value каждого члена, то включаются только те члены, для которых предикат возвращает истинное значение.

Примечание

getmembers() возвращает только атрибуты класса, определённые в метаклассе, если аргументом является класс, и эти атрибуты были перечислены в пользовательском __dir__() метакласса.

inspect.getmembers_static(object[, predicate])

Возвращает все члены объекта в виде списка кортежей (name, value) отсортированных по имени, не вызывая динамический поиск через протокол дескрипторов, __getattr__ или __getattribute__. При необходимости можно вернуть только те члены, которые удовлетворяют заданному предикату.

Примечание

getmembers_static() может быть не в состоянии получить все члены, которые может получить getmembers (например, динамически созданные атрибуты), и может найти членов, которых getmembers не может (например, дескрипторы, вызывающие AttributeError). В некоторых случаях он также может возвращать объекты дескрипторов вместо членов экземпляра.

Добавлено в версии 3.11.

inspect.getmodulename(path)

Возвращает имя модуля, заданного файлом path, без включения имён объемлющих пакетов. Расширение файла проверяется по всем записям в importlib.machinery.all_suffixes(). Если оно совпадает, возвращается последний компонент пути с удалённым расширением. В противном случае возвращается None.

Обратите внимание, что эта функция возвращает осмысленное имя только для реальных модулей Python – пути, которые потенциально ссылаются на пакеты Python, всё равно вернут None.

Изменено в версии 3.3: Функция напрямую основана на importlib.

inspect.ismodule(object)

Возвращает True, если объект является модулем.

inspect.isclass(object)

Возвращает True, если объект является классом (встроенным или созданным в коде Python).

inspect.ismethod(object)

Возвращает True, если объект является связанным методом, написанным на Python.

inspect.ispackage(object)

Возвращает True, если объект является пакетом.

Добавлено в версии 3.14.

inspect.isfunction(object)

Возвращает True, если объект является функцией Python, включая функции, созданные выражением lambda.

inspect.isgeneratorfunction(object)

Возвращает True, если объект является функцией-генератором Python.

Изменено в версии 3.8: Функции, обёрнутые в functools.partial(), теперь возвращают True, если обёрнутая функция является функцией-генератором Python.

Изменено в версии 3.13: Функции, обёрнутые в functools.partialmethod(), теперь возвращают True, если обёрнутая функция является функцией-генератором Python.

inspect.isgenerator(object)

Возвращает True, если объект является генератором.

inspect.iscoroutinefunction(object)

Возвращает True, если объект является корутинной функцией (функцией, определённой с синтаксисом async def), functools.partial(), обёртывающей корутинную функцию, или синхронной функцией, помеченной markcoroutinefunction().

Добавлено в версии 3.5.

Изменено в версии 3.8: Функции, обёрнутые в functools.partial(), теперь возвращают True, если обёрнутая функция является корутинной функцией.

Изменено в версии 3.12: Синхронные функции, помеченные markcoroutinefunction(), теперь возвращают True.

Изменено в версии 3.13: Функции, обёрнутые в functools.partialmethod(), теперь возвращают True, если обёрнутая функция является корутинной функцией.

inspect.markcoroutinefunction(func)

Декоратор, помечающий вызываемый объект как корутинную функцию, если иначе она не была бы обнаружена iscoroutinefunction().

Это может пригодиться для синхронных функций, возвращающих корутину, если функция передаётся в API, требующее iscoroutinefunction().

Когда возможно, предпочтительнее использовать функцию async def. Также допустимо вызвать функцию и проверить возвращаемое значение с помощью iscoroutine().

Добавлено в версии 3.12.

inspect.iscoroutine(object)

Возвращает True, если объект является корутиной, созданной функцией async def.

Добавлено в версии 3.5.

inspect.isawaitable(object)

Возвращает True, если объект может использоваться в выражении await.

Также может использоваться для отличия корутин, основанных на генераторах, от обычных генераторов:

python
import types

def gen():
    yield
@types.coroutine
def gen_coro():
    yield

assert not isawaitable(gen())
assert isawaitable(gen_coro())

Добавлено в версии 3.5.

inspect.isasyncgenfunction(object)

Возвращает True, если объект является асинхронной функцией-генератором, например:

python
>>> async def agen():
...     yield 1
...
>>> inspect.isasyncgenfunction(agen)
True

Добавлено в версии 3.6.

Изменено в версии 3.8: Функции, обёрнутые в functools.partial(), теперь возвращают True, если обёрнутая функция является асинхронной функцией-генератором.

Изменено в версии 3.13: Функции, обёрнутые в functools.partialmethod(), теперь возвращают True, если обёрнутая функция является асинхронным генератором.

inspect.isasyncgen(object)

Возвращает True, если объект является итератором асинхронного генератора, созданным асинхронным генератором функцией.

Добавлено в версии 3.6.

inspect.istraceback(object)

Возвращает True, если объект является traceback.

inspect.isframe(object)

Возвращает True, если объект является frame.

inspect.iscode(object)

Возвращает True, если объект является code.

inspect.isbuiltin(object)

Возвращает True, если объект является встроенной функцией или связанным встроенным методом.

inspect.ismethodwrapper(object)

Возвращает True, если тип объекта является MethodWrapperType.

Это экземпляры MethodWrapperType, такие как __str__(), __eq__() и __repr__().

Добавлено в версии 3.11.

inspect.isroutine(object)

Возвращает True, если объект является пользовательской или встроенной функцией или методом.

inspect.isabstract(object)

Возвращает True, если объект является абстрактным базовым классом.

inspect.ismethoddescriptor(object)

Возвращает True, если объект является дескриптором метода, но не возвращает, если ismethod(), isclass(), isfunction() или isbuiltin() истинны.

Это верно, например, для int.__add__. Объект, проходящий этот тест, имеет метод __get__(), но не имеет метода __set__() или метода __delete__(). Кроме того, набор атрибутов различается. Атрибут __name__ обычно имеет смысл, и __doc__ часто тоже.

Методы, реализованные через дескрипторы, которые также проходят один из других тестов, возвращают False из теста ismethoddescriptor(), просто потому что другие тесты обещают больше – например, можно рассчитывать на наличие атрибута __func__ (и так далее), когда объект проходит ismethod().

Изменено в версии 3.13: Эта функция больше не ошибочно сообщает, что объекты с __get__() и __delete__(), но не __set__(), являются дескрипторами методов (такие объекты являются дескрипторами данных, а не дескрипторами методов).

inspect.isdatadescriptor(object)

Возвращает True, если объект является дескриптором данных.

Дескрипторы данных имеют метод __set__ или __delete__. Примеры: свойства (определённые в Python), getsets и members. Последние два определены на C, и для этих типов доступны более специфичные тесты, что является надёжным для всех реализаций Python. Обычно дескрипторы данных также имеют атрибуты __name__ и __doc__ (свойства, getsets и members имеют оба этих атрибута), но это не гарантируется.

inspect.isgetsetdescriptor(object)

Возвращает True, если объект является дескриптором getset.

Особенности реализации CPython: getsets – это атрибуты, определённые в модулях расширения через структуры PyGetSetDef. Для реализаций Python, не имеющих таких типов, этот метод всегда будет возвращать False.

inspect.ismemberdescriptor(object)

Возвращает True, если объект является дескриптором member.

Особенности реализации CPython: Дескрипторы member – это атрибуты, определённые в модулях расширения через структуры PyMemberDef. Для реализаций Python, не имеющих таких типов, этот метод всегда будет возвращать False.

Retrieving source codeИзвлечение исходного кода

inspect.getdoc(object, *, inherit_class_doc=True, fallback_to_class_doc=True)

Получает строку документации для объекта, очищенную с помощью cleandoc(). Если строка документации для объекта не указана:

  • если объект – класс и inherit_class_doc равен true (по умолчанию), строка документации берётся из иерархии наследования;

  • если объект – метод, свойство или дескриптор, строка документации берётся из иерархии наследования;

  • в противном случае, если fallback_to_class_doc равен true (по умолчанию), строка документации берётся из класса объекта.

Возвращает None, если строка документации некорректна или отсутствует.

Изменено в версии 3.5: Строки документации теперь наследуются, если не переопределены.

Изменено в версии 3.15: Добавлены параметры inherit_class_doc и fallback_to_class_doc.

Строки документации для объектов cached_property теперь наследуются, если не переопределены.

inspect.getcomments(object)

Возвращает в виде одной строки все строки комментариев, непосредственно предшествующие исходному коду объекта (для класса, функции или метода), или в начале файла исходного кода Python (если объект – модуль). Если исходный код объекта недоступен, возвращает None. Это может произойти, если объект был определён на C или в интерактивной оболочке.

inspect.getfile(object)

Возвращает имя (текстового или двоичного) файла, в котором был определён объект. Это вызовет TypeError, если объект является встроенным модулем, классом или функцией.

inspect.getmodule(object)

Пытается угадать, в каком модуле был определён объект. Возвращает None, если модуль не удаётся определить.

inspect.getsourcefile(object)

Возвращает имя исходного файла Python, в котором был определён объект, или None, если не удаётся определить способ получения исходного кода. Это вызовет TypeError, если объект является встроенным модулем, классом или функцией.

inspect.getsourcelines(object)

Возвращает список строк исходного кода и номер начальной строки для объекта. Аргументом может быть модуль, класс, метод, функция, трассировка, фрейм или объект кода. Исходный код возвращается в виде списка строк, соответствующих объекту, а номер строки указывает, где в исходном файле находится первая строка кода. Возникает OSError, если исходный код не удаётся получить. Возникает TypeError, если объект является встроенным модулем, классом или функцией.

Изменено в версии 3.3: OSError возбуждается вместо IOError, теперь являющегося псевдонимом первого.

inspect.getsource(object)

Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, трассировка, фрейм или объект кода. Исходный код возвращается в виде одной строки. Возникает OSError, если исходный код не удаётся получить. Возникает TypeError, если объект является встроенным модулем, классом или функцией.

Изменено в версии 3.3: OSError возбуждается вместо IOError, теперь являющегося псевдонимом первого.

inspect.cleandoc(doc)

Очищает отступы в строках документации, которые имеют отступы для выравнивания с блоками кода.

Все начальные пробелы удаляются из первой строки. Любые начальные пробелы, которые можно равномерно удалить со второй строки и далее, удаляются. Пустые строки в начале и конце затем удаляются. Также все табуляции заменяются пробелами.

Introspecting callables with the Signature objectИнтроспекция вызываемых объектов с помощью объекта Signature

Добавлено в версии 3.3.

Объект Signature представляет сигнатуру вызова вызываемого объекта и аннотацию возвращаемого значения. Чтобы получить объект Signature, используйте функцию signature().

inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)

Возвращает объект Signature для указанного callable:

python
>>> from inspect import signature
>>> def foo(a, *, b:int, **kwargs):
...     pass

>>> sig = signature(foo)

>>> str(sig)
'(a, *, b: int, **kwargs)'

>>> str(sig.parameters['b'])
'b: int'

>>> sig.parameters['b'].annotation
<class 'int'>

Принимает широкий спектр вызываемых объектов Python: от обычных функций и классов до объектов functools.partial().

Если некоторые аннотации являются строками (например, потому что был использован from __future__ import annotations), signature() попытается автоматически преобразовать строки обратно в аннотации с помощью annotationlib.get_annotations(). Параметры globals, locals и eval_str передаются в annotationlib.get_annotations() при разрешении аннотаций; за инструкциями по использованию этих параметров обращайтесь к документации annotationlib.get_annotations(). Элемент перечисления annotationlib.Format можно передать в параметр annotation_format для управления форматом возвращаемых аннотаций. Например, используйте annotation_format=annotationlib.Format.STRING, чтобы получить аннотации в строковом формате.

Вызывает ValueError, если не удаётся предоставить сигнатуру, и TypeError, если тип объекта не поддерживается. Кроме того, если аннотации преобразованы в строки и eval_str не является ложным, вызов(ы) eval() для преобразования строк обратно в аннотации в annotationlib.get_annotations() потенциально может вызвать исключение любого типа.

Косая черта (/) в сигнатуре функции означает, что параметры до неё являются только позиционными. Дополнительную информацию см. в вопрос из FAQ о только позиционных параметрах.

Изменено в версии 3.5: Был добавлен параметр follow_wrapped. Передайте False, чтобы получить сигнатуру конкретного вызываемого объекта (callable.__wrapped__ не будет использоваться для разворачивания декорированных вызываемых объектов).

Изменено в версии 3.10: Были добавлены параметры globals, locals и eval_str.

Изменено в версии 3.14: Был добавлен параметр annotation_format.

Примечание

Некоторые вызываемые объекты могут быть недоступны для интроспекции в некоторых реализациях Python. Например, в CPython некоторые встроенные функции, определённые на C, не предоставляют метаданных о своих аргументах.

Особенность реализации CPython: Если переданный объект имеет атрибут __signature__, мы можем использовать его для создания сигнатуры. Точная семантика является деталью реализации и может быть изменена без предварительного уведомления. За текущей семантикой обращайтесь к исходному коду.

class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)

Объект Signature представляет сигнатуру вызова функции и её аннотацию возврата. Для каждого параметра, принимаемого функцией, он хранит объект Parameter в своей коллекции parameters.

Необязательный аргумент parameters представляет собой последовательность объектов Parameter, которая проверяется на отсутствие параметров с одинаковыми именами, а также на то, что параметры расположены в правильном порядке, т.е. сначала только позиционные, затем позиционно-ключевые, и что параметры со значениями по умолчанию следуют за параметрами без значений по умолчанию.

Необязательный аргумент return_annotation может быть произвольным объектом Python. Он представляет аннотацию «возврата» вызываемого объекта.

Объекты Signature являются неизменяемыми. Используйте Signature.replace() или copy.replace() для создания изменённой копии.

Изменено в версии 3.5: Объекты Signature теперь можно сериализовать и они хэшируемы.

empty

Специальный маркер уровня класса для указания отсутствия аннотации возврата.

parameters

Упорядоченное отображение имён параметров на соответствующие объекты Parameter. Параметры располагаются в строгом порядке определения, включая только ключевые параметры.

Изменено в версии 3.7: Python явно гарантирует сохранение порядка объявления только ключевых параметров, начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.

return_annotation

Аннотация «возврата» для вызываемого объекта. Если вызываемый объект не имеет аннотации «возврата», этот атрибут устанавливается в Signature.empty.

bind(*args, **kwargs)

Создаёт отображение позиционных и ключевых аргументов на параметры. Возвращает BoundArguments, если *args и **kwargs соответствуют сигнатуре, или вызывает TypeError.

bind_partial(*args, **kwargs)

Работает так же, как Signature.bind(), но позволяет опускать некоторые обязательные аргументы (имитирует поведение functools.partial().) Возвращает BoundArguments или вызывает TypeError, если переданные аргументы не соответствуют сигнатуре.

replace(*[, parameters][, return_annotation])

Создаёт новый экземпляр Signature на основе экземпляра, на котором был вызван replace(). Можно передать другие parameters и/или return_annotation, чтобы переопределить соответствующие свойства базовой сигнатуры. Чтобы удалить return_annotation из скопированного Signature, передайте Signature.empty.

python
>>> def test(a, b):
...     pass
...
>>> sig = signature(test)
>>> new_sig = sig.replace(return_annotation="new return anno")
>>> str(new_sig)
"(a, b) -> 'new return anno'"

Объекты Signature также поддерживаются обобщённой функцией copy.replace().

format(*, max_width=None, quote_annotation_strings=True)

Создаёт строковое представление объекта Signature.

Если передан max_width, метод попытается уместить сигнатуру в строки длиной не более max_width символов. Если сигнатура длиннее max_width, все параметры будут размещены на отдельных строках.

Если quote_annotation_strings равен False, аннотации в сигнатуре отображаются без открывающих и закрывающих кавычек, если они являются строками. Это полезно, если сигнатура была создана с форматом STRING или если был использован from __future__ import annotations.

Добавлено в версии 3.13.

Изменено в версии 3.14: Добавлен параметр unquote_annotations.

classmethod from_callable(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)

Возвращает объект Signature (или его подкласс) для заданного вызываемого объекта obj.

Этот метод упрощает создание подклассов Signature:

python
class MySignature(Signature):
    pass
sig = MySignature.from_callable(sum)
assert isinstance(sig, MySignature)

В остальном его поведение идентично поведению signature().

Добавлено в версии 3.5.

Изменено в версии 3.10: Добавлены параметры globals, locals и eval_str.

class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)

Объекты Parameter являются неизменяемыми. Вместо изменения объекта Parameter можно использовать Parameter.replace() или copy.replace() для создания изменённой копии.

Изменено в версии 3.5: Объекты Parameter теперь сериализуемы и хешируемы.

empty

Специальный маркер уровня класса для указания отсутствия значений по умолчанию и аннотаций.

name

Имя параметра в виде строки. Имя должно быть допустимым идентификатором Python.

Особенность реализации CPython: CPython генерирует неявные имена параметров вида .0 в объектах кода, используемых для реализации генераторных выражений и включений (comprehensions).

Изменено в версии 3.6: Теперь этот модуль предоставляет такие имена параметров в виде implicit0.

default

Значение по умолчанию для параметра. Если у параметра нет значения по умолчанию, этот атрибут устанавливается в Parameter.empty.

annotation

Аннотация параметра. Если у параметра нет аннотации, этот атрибут устанавливается в Parameter.empty.

kind

Описывает, как значения аргументов привязываются к параметру. Возможные значения доступны через Parameter (например, Parameter.KEYWORD_ONLY) и поддерживают сравнение и упорядочивание в следующем порядке:

Имя

Значение

POSITIONAL_ONLY

Значение должно быть передано как позиционный аргумент. Параметры только для позиционной передачи – это те, которые находятся перед записью / (если она присутствует) в определении функции Python.

POSITIONAL_OR_KEYWORD

Значение может быть передано как ключевой или позиционный аргумент (это стандартное поведение привязки для функций, реализованных на Python).

VAR_POSITIONAL

Кортеж позиционных аргументов, не привязанных ни к какому другому параметру. Это соответствует параметру *args в определении функции Python.

KEYWORD_ONLY

Значение должно быть передано как ключевой аргумент. Параметры только для ключевой передачи – это те, которые находятся после записи * или *args в определении функции Python.

VAR_KEYWORD

Словарь ключевых аргументов, не привязанных ни к какому другому параметру. Это соответствует параметру **kwargs в определении функции Python.

Пример: вывод всех ключевых аргументов без значений по умолчанию:

python
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c
kind.description

Описывает значение перечисления Parameter.kind.

Добавлено в версии 3.8.

Пример: вывод всех описаний аргументов:

python
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     print(param.kind.description)
positional or keyword
positional or keyword
keyword-only
keyword-only
replace(*[, name][, kind][, default][, annotation])

Создаёт новый экземпляр Parameter на основе экземпляра, для которого была вызвана замена. Чтобы переопределить атрибут Parameter, передайте соответствующий аргумент. Чтобы удалить значение по умолчанию и/или аннотацию из Parameter, передайте Parameter.empty.

python
>>> from inspect import Parameter
>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)
>>> str(param)
'foo=42'

>>> str(param.replace()) # Создаст поверхностную копию 'param'
'foo=42'

>>> str(param.replace(default=Parameter.empty, annotation='spam'))
"foo: 'spam'"

Объекты Parameter также поддерживаются универсальной функцией copy.replace().

Изменено в версии 3.4: В Python 3.3 объектам Parameter разрешалось иметь name, установленное в None, если их kind было установлено в POSITIONAL_ONLY. Это больше не допускается.

class inspect.BoundArguments

Результат вызова Signature.bind() или Signature.bind_partial(). Содержит отображение аргументов на параметры функции.

arguments

Изменяемое отображение имён параметров на значения аргументов. Содержит только явно связанные аргументы. Изменения в arguments отразятся в args и kwargs.

Следует использовать совместно с Signature.parameters для любых целей обработки аргументов.

Примечание

Аргументы, для которых Signature.bind() или Signature.bind_partial() полагались на значение по умолчанию, пропускаются. Однако при необходимости используйте BoundArguments.apply_defaults(), чтобы добавить их.

Изменено в версии 3.9: arguments теперь имеет тип dict. Ранее он был типа collections.OrderedDict.

args

Кортеж значений позиционных аргументов. Вычисляется динамически из атрибута arguments.

kwargs

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

signature

Ссылка на родительский объект Signature.

apply_defaults()

Устанавливает значения по умолчанию для отсутствующих аргументов.

Для переменных позиционных аргументов (*args) по умолчанию используется пустой кортеж.

Для переменных ключевых аргументов (**kwargs) по умолчанию используется пустой словарь.

python
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
{'a': 'spam', 'b': 'ham', 'args': ()}

Добавлено в версии 3.5.

Свойства args и kwargs можно использовать для вызова функций:

python
def test(a, *, b):
    ...

sig = signature(test)
ba = sig.bind(10, b=20)
test(*ba.args, **ba.kwargs)

Смотрите также

PEP 362 – объект сигнатуры функции.

Подробная спецификация, детали реализации и примеры.

Classes and functionsКлассы и функции

inspect.getclasstree(classes, unique=False)

Упорядочивает заданный список классов в иерархию вложенных списков. Если появляется вложенный список, он содержит классы, производные от класса, запись которого непосредственно предшествует этому списку. Каждая запись представляет собой кортеж из двух элементов: класса и кортежа его базовых классов. Если аргумент unique истинен, в возвращаемой структуре появляется ровно одна запись для каждого класса из заданного списка. В противном случае классы, использующие множественное наследование, и их потомки будут появляться несколько раз.

inspect.getfullargspec(func)

Получает имена и значения по умолчанию параметров функции Python. Возвращается именованный кортеж:

FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)

args – список имён позиционных параметров. varargs – имя параметра * или None, если произвольные позиционные аргументы не принимаются. varkw – имя параметра ** или None, если произвольные именованные аргументы не принимаются. defaultsn-кортеж значений аргументов по умолчанию, соответствующих последним n позиционным параметрам, или None, если такие значения по умолчанию не определены. kwonlyargs – список имён только-именованных параметров в порядке объявления. kwonlydefaults – словарь, сопоставляющий имена параметров из kwonlyargs значениям по умолчанию, используемым, если аргумент не передан. annotations – словарь, сопоставляющий имена параметров аннотациям. Специальный ключ "return" используется для указания аннотации возвращаемого значения функции (если она есть).

Обратите внимание, что signature() и Signature Object предоставляют рекомендуемый API для интроспекции вызываемых объектов и поддерживают дополнительные возможности (например, только-позиционные аргументы), которые иногда встречаются в API модулей расширения. Эта функция сохранена в основном для использования в коде, который должен поддерживать совместимость с API модуля inspect Python 2.

Изменено в версии 3.4: Эта функция теперь основана на signature(), но по-прежнему игнорирует атрибуты __wrapped__ и включает уже связанный первый параметр в вывод сигнатуры для связанных методов.

Изменено в версии 3.6: Ранее этот метод был задокументирован как устаревший в пользу signature() в Python 3.5, но это решение было отменено, чтобы восстановить чётко поддерживаемый стандартный интерфейс для кода на Python 2/3 из единого источника, мигрирующего от устаревшего API getargspec().

Изменено в версии 3.7: Python явно гарантировал сохранение порядка объявления только-именованных параметров только начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.

inspect.getargvalues(frame)

Получает информацию об аргументах, переданных в конкретный кадр. Возвращается именованный кортеж ArgInfo(args, varargs, keywords, locals). args – список имён аргументов. varargs и keywords – это имена аргументов * и ** или None. locals – словарь локальных переменных данного кадра.

Примечание

Эта функция была случайно помечена как устаревшая в Python 3.5.

inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])

Форматирует красивое описание аргументов из четырёх значений, возвращаемых getargvalues(). Аргументы format* – это соответствующие необязательные функции форматирования, которые вызываются для преобразования имён и значений в строки.

Примечание

Эта функция была случайно помечена как устаревшая в Python 3.5.

inspect.getmro(cls)

Возвращает кортеж базовых классов класса cls, включая cls, в порядке разрешения методов. Ни один класс не встречается в этом кортеже более одного раза. Обратите внимание, что порядок разрешения методов зависит от типа cls. Если не используется какой-то очень специфический пользовательский метатип, cls будет первым элементом кортежа.

inspect.getcallargs(func, /, *args, **kwds)

Связывает args и kwds с именами аргументов функции или метода Python func, как если бы она была вызвана с ними. Для связанных методов также связывает первый аргумент (обычно называемый self) с соответствующим экземпляром. Возвращается словарь, сопоставляющий имена аргументов (включая имена аргументов * и **, если они есть) с их значениями из args и kwds. В случае некорректного вызова func, т.е. когда func(*args, **kwds) возбудило бы исключение из-за несовместимой сигнатуры, возбуждается исключение того же типа и с тем же или похожим сообщением. Например:

python
>>> from inspect import getcallargs
>>> def f(a, b=1, *pos, **named):
...     pass
...
>>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}
True
>>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}
True
>>> getcallargs(f)
Traceback (most recent call last):
...
TypeError: f() missing 1 required positional argument: 'a'

Добавлено в версии 3.2.

Устарело с версии 3.5: Вместо этого используйте Signature.bind() и Signature.bind_partial().

inspect.getclosurevars(func)

Получает отображение ссылок на внешние имена в функции или методе Python func на их текущие значения. Возвращается именованный кортеж ClosureVars(nonlocals, globals, builtins, unbound). nonlocals сопоставляет ссылочные имена лексическим переменным замыкания, globals – глобальным переменным модуля функции, а builtins – встроенным функциям, видимым из тела функции. unbound – это набор имён, на которые есть ссылки в функции, но которые не могут быть разрешены при данных текущих глобальных переменных модуля и встроенных функциях.

TypeError возбуждается, если func не является функцией или методом Python.

Добавлено в версии 3.3.

inspect.unwrap(func, *, stop=None)

Получает объект, обёрнутый в func. Он проходит по цепочке атрибутов __wrapped__, возвращая последний объект в цепочке.

stop – необязательный колбэк, принимающий объект в цепочке обёрток в качестве единственного аргумента и позволяющий досрочно завершить разворачивание, если колбэк возвращает истинное значение. Если колбэк никогда не возвращает истинное значение, возвращается последний объект в цепочке как обычно. Например, signature() использует это для остановки разворачивания, если какой-либо объект в цепочке имеет определённый атрибут __signature__.

ValueError возбуждается, если обнаружен цикл.

Добавлено в версии 3.4.

inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)

Вычисляет словарь аннотаций для объекта.

Это псевдоним для annotationlib.get_annotations(); обратитесь к документации этой функции для получения дополнительной информации.

Предостережение

Эта функция может выполнять произвольный код, содержащийся в аннотациях. См. Вопросы безопасности при интроспекции аннотаций для получения дополнительной информации.

Добавлено в версии 3.10.

Изменено в версии 3.14: Эта функция теперь является псевдонимом для annotationlib.get_annotations(). Вызов её как inspect.get_annotations продолжит работать.

The interpreter stackСтек интерпретатора

Некоторые из следующих функций возвращают объекты FrameInfo. Для обратной совместимости эти объекты допускают операции, подобные кортежу, для всех атрибутов, кроме positions. Это поведение считается устаревшим и может быть удалено в будущем.

class inspect.FrameInfo
frame

Объект фрейма, которому соответствует запись.

filename

Имя файла, связанное с кодом, исполняемым фреймом, которому соответствует данная запись.

lineno

Номер текущей строки, связанной с кодом, исполняемым фреймом, которому соответствует данная запись.

function

Имя функции, исполняемой фреймом, которому соответствует данная запись.

code_context

Список строк контекста из исходного кода, исполняемого фреймом, которому соответствует данная запись.

index

Индекс текущей исполняемой строки в списке code_context.

positions

Объект dis.Positions, содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанные с инструкцией, исполняемой фреймом, которому соответствует данная запись.

Изменено в версии 3.5: Возвращает именованный кортеж вместо tuple.

Изменено в версии 3.11: FrameInfo теперь является экземпляром класса (обратно совместим с предыдущим именованным кортежем).

class inspect.Traceback
filename

Имя файла, связанное с кодом, исполняемым фреймом, которому соответствует данная трассировка.

lineno

Номер текущей строки, связанной с кодом, исполняемым фреймом, которому соответствует данная трассировка.

function

Имя функции, исполняемой фреймом, которому соответствует данная трассировка.

code_context

Список строк контекста из исходного кода, исполняемого фреймом, которому соответствует данная трассировка.

index

Индекс текущей исполняемой строки в списке code_context.

positions

Объект dis.Positions, содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанные с инструкцией, исполняемой фреймом, которому соответствует данная трассировка.

Изменено в версии 3.11: Traceback теперь является экземпляром класса (обратно совместим с предыдущим именованным кортежем).

Примечание

Хранение ссылок на объекты фреймов, которые находятся в первом элементе записей фреймов, возвращаемых этими функциями, может привести к созданию циклических ссылок в вашей программе. Как только циклическая ссылка создана, время жизни всех объектов, доступных из объектов, образующих цикл, может значительно увеличиться, даже если включён опциональный детектор циклов Python. Если такие циклы необходимо создавать, важно явно разрывать их, чтобы избежать отложенного уничтожения объектов и увеличения потребления памяти.

Хотя детектор циклов обнаружит эти ссылки, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, удалив цикл в блоке finally. Это также важно, если детектор циклов был отключён при компиляции Python или с помощью gc.disable(). Например:

python
def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # сделать что-то с фреймом
    finally:
        del frame

Если требуется сохранить фрейм (например, для последующего вывода трассировки), можно также разорвать циклические ссылки с помощью метода frame.clear().

Необязательный аргумент context, поддерживаемый большинством этих функций, задаёт количество возвращаемых строк контекста, которые располагаются вокруг текущей строки.

inspect.getframeinfo(frame, context=1)

Возвращает информацию об объекте фрейма или трассировки. Возвращается объект Traceback.

Изменено в версии 3.11: Вместо именованного кортежа возвращается объект Traceback.

inspect.getouterframes(frame, context=1)

Возвращает список объектов FrameInfo для фрейма и всех внешних фреймов. Эти фреймы представляют вызовы, которые привели к созданию фрейма. Первая запись в возвращаемом списке представляет фрейм; последняя запись представляет самый внешний вызов в стеке фрейма.

Изменено в версии 3.5: Возвращается список именованных кортежей FrameInfo(frame, filename, lineno, function, code_context, index).

Изменено в версии 3.11: Возвращается список объектов FrameInfo.

inspect.getinnerframes(traceback, context=1)

Возвращает список объектов FrameInfo для фрейма трассировки и всех внутренних фреймов. Эти фреймы представляют вызовы, выполненные как следствие фрейма. Первая запись в списке представляет трассировку; последняя запись представляет место, где было вызвано исключение.

Изменено в версии 3.5: Возвращается список именованных кортежей FrameInfo(frame, filename, lineno, function, code_context, index).

Изменено в версии 3.11: Возвращается список объектов FrameInfo.

inspect.currentframe()

Возвращает объект фрейма для фрейма стека вызывающей стороны.

Деталь реализации CPython: Эта функция полагается на поддержку фреймов стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python. Если она выполняется в реализации без поддержки фреймов стека Python, эта функция возвращает None.

inspect.stack(context=1)

Возвращает список объектов FrameInfo для стека вызывающей стороны. Первая запись в возвращаемом списке представляет вызывающую сторону; последняя запись представляет самый внешний вызов в стеке.

Изменено в версии 3.5: Возвращается список именованных кортежей FrameInfo(frame, filename, lineno, function, code_context, index).

Изменено в версии 3.11: Возвращается список объектов FrameInfo.

inspect.trace(context=1)

Возвращает список объектов FrameInfo для стека между текущим фреймом и фреймом, в котором было вызвано исключение, обрабатываемое в данный момент. Первая запись в списке представляет вызывающую сторону; последняя запись представляет место, где было вызвано исключение.

Изменено в версии 3.5: Возвращается список именованных кортежей FrameInfo(frame, filename, lineno, function, code_context, index).

Изменено в версии 3.11: Возвращается список объектов FrameInfo.

Fetching attributes staticallyСтатическое получение атрибутов

Как getattr(), так и hasattr() могут инициировать выполнение кода при получении или проверке существования атрибутов. Дескрипторы, такие как свойства, будут вызваны, и могут быть вызваны __getattr__() и __getattribute__().

Для случаев, когда требуется пассивная интроспекция, например в инструментах документирования, это может быть неудобно. getattr_static() имеет ту же сигнатуру, что и getattr(), но избегает выполнения кода при получении атрибутов.

inspect.getattr_static(obj, attr, default=None)

Извлекает атрибуты без запуска динамического поиска через протокол дескрипторов, __getattr__() или __getattribute__().

Примечание: эта функция может быть не в состоянии извлечь все атрибуты, которые может получить getattr (например, динамически созданные атрибуты), и может находить атрибуты, которые getattr не может (например, дескрипторы, вызывающие AttributeError). Она также может возвращать объекты дескрипторов вместо членов экземпляра.

Если экземпляр __dict__ затеняется другим членом (например, свойством), то эта функция не сможет найти члены экземпляра.

Добавлено в версии 3.2.

getattr_static() не разрешает дескрипторы, например слотовые дескрипторы или дескрипторы getset на объектах, реализованных на C. Вместо нижележащего атрибута возвращается объект дескриптора.

Такие ситуации можно обработать следующим кодом. Обратите внимание: для произвольных дескрипторов getset их вызов может инициировать выполнение кода:

python
# пример кода для разрешения встроенных типов дескрипторов
class _foo:
    __slots__ = ['foo']

slot_descriptor = type(_foo.foo)
getset_descriptor = type(type(open(__file__)).name)
wrapper_descriptor = type(str.__dict__['__add__'])
descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)

result = getattr_static(some_object, 'foo')
if type(result) in descriptor_types:
    try:
        result = result.__get__()
    except AttributeError:
        # дескрипторы могут вызывать AttributeError, чтобы
        # указать, что нет базового значения
        # в этом случае сам дескриптор будет
        # должен сделать
        pass

Current State of Generators, Coroutines, and Asynchronous GeneratorsТекущее состояние генераторов, корутин и асинхронных генераторов

При реализации планировщиков корутин и в других сложных сценариях использования генераторов бывает полезно определить, выполняется ли генератор в данный момент, ожидает запуска или возобновления, или уже завершился. getgeneratorstate() позволяет легко узнать текущее состояние генератора.

inspect.getgeneratorstate(generator)

Возвращает текущее состояние генератора-итератора.

Возможные состояния:

  • GEN_CREATED: Ожидает начала выполнения.

  • GEN_RUNNING: В данный момент выполняется интерпретатором.

  • GEN_SUSPENDED: Приостановлен в выражении yield.

  • GEN_CLOSED: Выполнение завершено.

Добавлено в версии 3.2.

inspect.getcoroutinestate(coroutine)

Возвращает текущее состояние объекта корутины. Эта функция предназначена для использования с объектами корутин, созданными async def функциями, но принимает любой объект, похожий на корутину, имеющий атрибуты cr_running и cr_frame.

Возможные состояния:

  • CORO_CREATED: Ожидает начала выполнения.

  • CORO_RUNNING: В данный момент выполняется интерпретатором.

  • CORO_SUSPENDED: Приостановлен в выражении await.

  • CORO_CLOSED: Выполнение завершено.

Добавлено в версии 3.5.

inspect.getasyncgenstate(agen)

Возвращает текущее состояние асинхронного генератора. Эта функция предназначена для использования с объектами асинхронных итераторов, созданными async def функциями, которые используют оператор yield, но принимает любой объект, похожий на асинхронный генератор, имеющий атрибуты ag_running и ag_frame.

Возможные состояния:

  • AGEN_CREATED: Ожидает начала выполнения.

  • AGEN_RUNNING: В данный момент выполняется интерпретатором.

  • AGEN_SUSPENDED: Приостановлен в выражении yield.

  • AGEN_CLOSED: Выполнение завершено.

Добавлено в версии 3.12.

Можно также запросить текущее внутреннее состояние генератора. Это в основном полезно для тестирования, чтобы убедиться, что внутреннее состояние обновляется должным образом:

inspect.getgeneratorlocals(generator)

Возвращает отображение живых локальных переменных в generator на их текущие значения. Возвращается словарь, отображающий имена переменных в значения. Это эквивалентно вызову locals() в теле генератора, и применяются все те же предостережения.

Если generator является generator без текущего связанного фрейма, возвращается пустой словарь. TypeError возбуждается, если generator не является объектом генератора Python.

Особенность реализации CPython: Эта функция полагается на то, что генератор предоставляет стековый фрейм Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда возвращает пустой словарь.

Добавлено в версии 3.3.

inspect.getcoroutinelocals(coroutine)

Эта функция аналогична getgeneratorlocals(), но работает для объектов корутин, созданных async def функциями.

Добавлено в версии 3.5.

inspect.getasyncgenlocals(agen)

Эта функция аналогична getgeneratorlocals(), но работает с асинхронными объектами-генераторами, создаваемыми функциями async def, которые используют оператор yield.

Добавлено в версии 3.12.

Code Objects Bit FlagsБитовые флаги объектов кода

Объекты кода Python имеют атрибут co_flags, который представляет собой битовую маску следующих флагов:

inspect.CO_OPTIMIZED

Объект кода оптимизирован: используются быстрые локальные переменные.

inspect.CO_NEWLOCALS

Если установлен, при выполнении объекта кода для f_locals фрейма будет создан новый словарь.

inspect.CO_VARARGS

Объект кода имеет вариативный позиционный параметр (наподобие *args).

inspect.CO_VARKEYWORDS

Объект кода имеет вариативный именованный параметр (наподобие **kwargs).

inspect.CO_NESTED

Флаг устанавливается, когда объект кода является вложенной функцией.

inspect.CO_GENERATOR

Флаг устанавливается, когда объект кода является функцией-генератором, то есть при выполнении объекта кода возвращается объект-генератор.

inspect.CO_COROUTINE

Флаг устанавливается, когда объект кода является корутинной функцией. При выполнении объекта кода возвращается объект-корутина. Подробнее см. PEP 492.

Добавлено в версии 3.5.

inspect.CO_ITERABLE_COROUTINE

Этот флаг используется для преобразования генераторов в корутины на основе генераторов. Объекты-генераторы с этим флагом могут использоваться в выражении await и могут yield from объекты-корутины. Подробнее см. PEP 492.

Добавлено в версии 3.5.

inspect.CO_ASYNC_GENERATOR

Флаг устанавливается, когда объект кода является асинхронной функцией-генератором. При выполнении объекта кода возвращается асинхронный объект-генератор. Подробнее см. PEP 525.

Добавлено в версии 3.6.

inspect.CO_HAS_DOCSTRING

Флаг устанавливается, когда в исходном коде есть строка документации для объекта кода. Если установлен, она будет первым элементом в co_consts.

Добавлено в версии 3.14.

inspect.CO_METHOD

Флаг устанавливается, когда объект кода является функцией, определенной в области видимости класса.

Добавлено в версии 3.14.

Примечание

Эти флаги специфичны для CPython и могут отсутствовать в других реализациях Python. Кроме того, флаги являются деталью реализации и могут быть удалены или объявлены устаревшими в будущих версиях Python. Для любых задач интроспекции рекомендуется использовать публичные API из модуля inspect.

Buffer flagsБуферные флаги

class inspect.BufferFlags

Это enum.IntFlag, представляющий флаги, которые можно передавать методу __buffer__() объектов, реализующих буферный протокол.

Значение флагов объясняется в типах буферных запросов.

SIMPLE
WRITABLE
FORMAT
ND
STRIDES
C_CONTIGUOUS
F_CONTIGUOUS
ANY_CONTIGUOUS
INDIRECT
CONTIG
CONTIG_RO
STRIDED
STRIDED_RO
RECORDS
RECORDS_RO
FULL
FULL_RO
READ
WRITE

Добавлено в версии 3.12.

Command-line interfaceИнтерфейс командной строки

Модуль inspect также предоставляет базовую возможность интроспекции из командной строки.

По умолчанию принимает имя модуля и выводит его исходный код. Вместо модуля можно вывести класс или функцию, добавив двоеточие и полное имя целевого объекта.

--details

Выводит информацию об указанном объекте вместо исходного кода