Документация Python неофициальный перевод
Содержание страницы

29.12. inspect – Инспекция живых объектовinspect – Inspect live objects

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


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

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

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

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

Тип Атрибут Описание
модуль doc строка документации
  file filename (отсутствует для встроенных модулей)
класс doc строка документации
  name имя, под которым был определён этот класс
  qualname полное имя
  module имя модуля, в котором был определён этот класс
метод doc строка документации
  name имя, под которым был определён этот метод
  qualname полное имя
  func объект функции, содержащий реализацию метода
  self экземпляр, к которому привязан этот метод, или None
функция doc строка документации
  name имя, под которым была определена эта функция
  qualname полное имя
  code объект кода, содержащий скомпилированную функцию байткод
  defaults кортеж значений по умолчанию для позиционных или именованных параметров
  kwdefaults отображение значений по умолчанию для параметров, доступных только по ключевым словам
  globals глобальное пространство имён, в котором была определена эта функция
  annotations отображение имён параметров в аннотации; ключ "return" зарезервирован для аннотаций возвращаемого значения.
трассировка tb_frame объект фрейма на этом уровне
  tb_lasti индекс последней предпринятой инструкции в байткоде
  tb_lineno текущий номер строки в исходном коде Python
  tb_next следующий внутренний объект traceback (вызванный на этом уровне)
фрейм f_back следующий внешний объект фрейма (вызывающий этот фрейм)
  f_builtins пространство имён builtins, видимое этим фреймом
  f_code объект кода, выполняющийся в этом фрейме
  f_globals глобальное пространство имён, видимое этим фреймом
  f_lasti индекс последней предпринятой инструкции в байткоде
  f_lineno текущий номер строки в исходном коде Python
  f_locals локальное пространство имён, видимое этим фреймом
  f_restricted 0 или 1, если фрейм находится в ограниченном режиме выполнения
  f_trace функция трассировки для этого фрейма или None
код co_argcount количество аргументов (не включая только именованные аргументы, * или ** args)
  co_code строка сырого скомпилированного байткода
  co_cellvars кортеж имён клеточных переменных (используемых в объёмлющих областях видимости)
  co_consts кортеж констант, используемых в байткоде
  co_filename имя файла, в котором был создан этот объект кода
  co_firstlineno номер первой строки в исходном коде Python
  co_flags битовая маска флагов CO_*, подробнее здесь
  co_lnotab кодированное отображение номеров строк на индексы байт-кода
  co_freevars кортеж имён свободных переменных (на которые есть ссылка через замыкание функции)
  co_kwonlyargcount количество только ключевых аргументов (не включая ** arg)
  co_name имя, с которым был определён этот объект кода
  co_names кортеж имён локальных переменных
  co_nlocals количество локальных переменных
  co_stacksize требуемый размер стека виртуальной машины
  co_varnames кортеж имён аргументов и локальных переменных
генератор name имя
  qualname полное имя
  gi_frame фрейм
  gi_running выполняется ли генератор?
  gi_code код
  gi_yieldfrom объект, итерируемый yield from, или None
корутина name имя
  qualname полное имя
  cr_await ожидаемый объект, или None
  cr_frame фрейм
  cr_running выполняется ли корутина?
  cr_code код
встроенный doc строка документации
  name исходное имя этой функции или метода
  qualname полное имя
  self экземпляр, к которому привязан метод, или None

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

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

inspect.getmembers(object[, predicate])

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

Примечание

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

inspect.getmoduleinfo(path)

Возвращает именованный кортеж ModuleInfo(name, suffix, mode, module_type) со значениями, описывающими, как Python будет интерпретировать файл, указанный path, если это модуль, или None, если он не распознан как модуль. В этом кортеже name – имя модуля без имени какого-либо включающего пакета, suffix – конечная часть имени файла (которая может не быть расширением, отделённым точкой), modeopen() режим, который будет использоваться ('r' или 'rb'), а module_type – целое число, указывающее тип модуля. module_type будет иметь значение, которое можно сравнить с константами, определёнными в модуле imp; см. документацию по этому модулю для получения дополнительной информации о типах модулей.

Устарело с версии 3.3: Можно проверить суффикс пути к файлу по списку поддерживаемых суффиксов, приведённому в importlib.machinery, чтобы вывести ту же информацию.

inspect.getmodulename(path)

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

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

Изменено в версии 3.3: Теперь эта функция напрямую основана на importlib, а не на устаревшем getmoduleinfo().

inspect.ismodule(object)

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

inspect.isclass(object)

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

inspect.ismethod(object)

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

inspect.isfunction(object)

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

inspect.isgeneratorfunction(object)

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

inspect.isgenerator(object)

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

inspect.iscoroutinefunction(object)

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

Новое в версии 3.5.

inspect.iscoroutine(object)

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

Новое в версии 3.5.

inspect.isawaitable(object)

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

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

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

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

Новое в версии 3.5.

inspect.istraceback(object)

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

inspect.isframe(object)

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

inspect.iscode(object)

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

inspect.isbuiltin(object)

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

inspect.isroutine(object)

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

inspect.isabstract(object)

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

inspect.ismethoddescriptor(object)

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

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

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

inspect.isdatadescriptor(object)

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

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

inspect.isgetsetdescriptor(object)

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

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

inspect.ismemberdescriptor(object)

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

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

29.12.2. Получение исходного кодаRetrieving source code

inspect.getdoc(object)

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

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

inspect.getcomments(object)

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

inspect.getfile(object)

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

inspect.getmodule(object)

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

inspect.getsourcefile(object)

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

inspect.getsourcelines(object)

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

Изменено в версии 3.3: OSError вызывается вместо IOError, который теперь является его псевдонимом.

inspect.getsource(object)

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

Изменено в версии 3.3: OSError вызывается вместо IOError, который теперь является его псевдонимом.

inspect.cleandoc(doc)

Убирает отступы из docstrings, которые выровнены с блоками кода.

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

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

Новое в версии 3.3.

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

inspect.signature(callable, *, follow_wrapped=True)

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

>>> 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().

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

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

Примечание

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

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

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

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

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

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

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

empty

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

parameters

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

return_annotation

Аннотация «return» вызываемого объекта. Если у вызываемого объекта нет аннотации «return», этот атрибут устанавливается в 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.empty.

>>> 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'"
classmethod from_callable(obj, *, follow_wrapped=True)

Возвращает объект Signature (или его подкласс) для заданного вызываемого объекта obj. Передайте follow_wrapped=False, чтобы получить сигнатуру obj без разворачивания цепочки __wrapped__.

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

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

Новое в версии 3.5.

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

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

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

empty

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

name

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

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.

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

>>> 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
replace(*[, name][, kind][, default][, annotation])

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

>>> 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'"

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

class inspect.BoundArguments

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

arguments

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

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

Примечание

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

args

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

kwargs

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

signature

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

apply_defaults()

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

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

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

>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])

Новое в версии 3.5.

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

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

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

См. также

PEP 362 – объект сигнатуры функции.
Подробная спецификация, детали реализации и примеры.

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

inspect.getclasstree(classes, unique=False)

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

inspect.getargspec(func)

Возвращает имена и значения по умолчанию аргументов функции Python. Возвращается именованный кортеж ArgSpec(args, varargs, keywords, defaults). args – список имён аргументов. varargs и keywords – имена * и ** аргументов или None. defaults – это кортеж значений аргументов по умолчанию или None, если аргументов по умолчанию нет; если этот кортеж содержит n элементов, они соответствуют последним n элементам, перечисленным в args.

Устарело с версии 3.0: Используйте signature() и объект Signature, которые предоставляют лучший API для интроспекции вызываемых объектов.

inspect.getfullargspec(func)

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

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

args – список имен аргументов. varargs и varkw – это имена аргументов * и ** или None. defaults – это n-кортеж значений по умолчанию последних n аргументов или None, если аргументов со значениями по умолчанию нет. kwonlyargs – список имен только ключевых аргументов. kwonlydefaults – словарь, отображающий имена из kwonlyargs в значения по умолчанию. annotations – словарь, отображающий имена аргументов в аннотации.

Первые четыре элемента кортежа соответствуют getargspec().

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

Устарело с версии 3.5: Используйте signature() и Signature Object, которые предоставляют лучший API интроспекции для вызываемых объектов.

inspect.getargvalues(frame)

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

Примечание

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

inspect.formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]])

Форматирует читаемое описание аргументов на основе значений, возвращаемых getargspec() или getfullargspec().

Первые семь аргументов: (args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations).

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

Например:

>>> from inspect import formatargspec, getfullargspec
>>> def f(a: int, b: float):
...     pass
...
>>> formatargspec(*getfullargspec(f))
'(a: int, b: float)'

Устарело с версии 3.5: Используйте signature() и Signature Object, которые предоставляют лучший API интроспекции для вызываемых объектов.

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

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

Примечание

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

inspect.getmro(cls)

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

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

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

>>> 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.

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

Когда следующие функции возвращают «записи о фреймах», каждая запись представляет собой именованный кортеж FrameInfo(frame, filename, lineno, function, code_context, index). Кортеж содержит объект фрейма, имя файла, номер текущей строки, имя функции, список строк контекста из исходного кода и индекс текущей строки в этом списке.

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

Примечание

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

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

def handle_stackframe_without_leak():
    frame = inspect.currentframe()
    try:
        # Выполнить действие с фреймом
    finally:
        del frame

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

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

inspect.getframeinfo(frame, context=1)

Возвращает информацию об объекте фрейма или traceback. Возвращается именованный кортеж Traceback(filename, lineno, function, code_context, index).

inspect.getouterframes(frame, context=1)

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

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

inspect.getinnerframes(traceback, context=1)

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

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

inspect.currentframe()

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

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

inspect.stack(context=1)

Возвращает список записей о фреймах для стека вызывающего кода. Первый элемент возвращаемого списка представляет вызывающий код; последний элемент представляет самый внешний вызов в стеке.

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

inspect.trace(context=1)

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

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

29.12.6. Статическое получение атрибутов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-дескрипторов их вызов может запустить выполнение кода:

# Пример кода для разрешения встроенных типов дескрипторов
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

29.12.7. Текущее состояние генераторов и корутинCurrent State of Generators and Coroutines

При реализации планировщиков корутин и для других продвинутых случаев использования генераторов полезно определять, выполняется ли генератор в данный момент, ожидает запуска или возобновления, или уже завершился. 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.getgeneratorlocals(generator)

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

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

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

Новое в версии 3.3.

inspect.getcoroutinelocals(coroutine)

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

Новое в версии 3.5.

29.12.8. Битовые флаги объектов кода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_NOFREE

Флаг установлен, если нет свободных переменных или переменных ячейки.

inspect.CO_COROUTINE

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

Новое в версии 3.5.

inspect.CO_ITERABLE_COROUTINE

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

Новое в версии 3.5.

Примечание

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

29.12.9. Интерфейс командной строкиCommand Line Interface

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

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

--details

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