Содержание страницы
28.13. inspect – Инспекция активных объектов¶inspect – Inspect live objects
Новое в версии 2.1.
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты кадров и объекты кода. Например, он позволяет изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов функции или получить всю информацию, необходимую для вывода подробной трассировки.
Этот модуль предоставляет четыре основных вида сервисов: проверка типов, получение исходного кода, инспекция классов и функций, а также анализ стека интерпретатора.
28.13.1. Типы и члены¶Types and members
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Шестнадцать функций, имена которых начинаются с «is», в основном предоставлены как удобные варианты для второго аргумента getmembers(). Они также помогают определить, когда можно ожидать следующие специальные атрибуты:
Тип |
Атрибут |
Описание |
Примечания |
|---|---|---|---|
модуль |
doc |
строка документации |
|
file |
filename (отсутствует для встроенных модулей) |
||
класс |
doc |
строка документации |
|
module |
имя модуля, в котором был определён этот класс |
||
метод |
doc |
строка документации |
|
name |
имя, под которым был определён этот метод |
||
im_class |
объект класса, запросившего этот метод |
(1) |
|
im_func или __func__ |
объект функции, содержащий реализацию метода |
||
im_self или __self__ |
экземпляр, к которому привязан этот метод, или |
||
функция |
doc |
строка документации |
|
name |
имя, под которым была определена эта функция |
||
func_code |
объект кода, содержащий скомпилированную функцию байткод |
||
func_defaults |
кортеж значений по умолчанию для аргументов |
||
func_doc |
(то же, что и __doc__) |
||
func_globals |
глобальное пространство имён, в котором была определена эта функция |
||
func_name |
(то же, что и __name__) |
||
генератор |
iter |
определён для поддержки итерации по контейнеру |
|
close |
возбуждает новое исключение GeneratorExit внутри генератора, чтобы завершить итерацию |
||
gi_code |
объект кода |
||
gi_frame |
объект фрейма или, возможно,
|
||
gi_running |
установлено в 1, когда генератор выполняется, иначе 0 |
||
далее |
возвращает следующий элемент из контейнера |
||
send |
возобновляет генератор и «отправляет» значение, которое становится результатом текущего yield-выражения |
||
throw |
используется для возбуждения исключения внутри генератора |
||
трассировка |
tb_frame |
объект фрейма на этом уровне |
|
tb_lasti |
индекс последней предпринятой инструкции в байткоде |
||
tb_lineno |
текущий номер строки в исходном коде Python |
||
tb_next |
следующий внутренний объект traceback (вызванный на этом уровне) |
||
фрейм |
f_back |
следующий внешний объект фрейма (вызывающий этот фрейм) |
|
f_builtins |
пространство имён builtins, видимое этим фреймом |
||
f_code |
объект кода, выполняющийся в этом фрейме |
||
f_exc_traceback |
traceback, если возникло в
этом кадре, или |
||
f_exc_type |
тип исключения, если возникло
в этом кадре, или
|
||
f_exc_value |
значение исключения, если возникло
в этом кадре, или
|
||
f_globals |
глобальное пространство имён, видимое этим фреймом |
||
f_lasti |
индекс последней предпринятой инструкции в байткоде |
||
f_lineno |
текущий номер строки в исходном коде Python |
||
f_locals |
локальное пространство имён, видимое этим фреймом |
||
f_restricted |
0 или 1, если фрейм находится в ограниченном режиме выполнения |
||
f_trace |
функция трассировки для этого
фрейма или |
||
код |
co_argcount |
количество аргументов (не включая * или ** args) |
|
co_code |
строка сырого скомпилированного байткода |
||
co_consts |
кортеж констант, используемых в байткоде |
||
co_filename |
имя файла, в котором был создан этот объект кода |
||
co_firstlineno |
номер первой строки в исходном коде Python |
||
co_flags |
битовая маска: 1=оптимизировано |
||
co_lnotab |
кодированное отображение номеров строк на индексы байт-кода |
||
co_name |
имя, с которым был определён этот объект кода |
||
co_names |
кортеж имён локальных переменных |
||
co_nlocals |
количество локальных переменных |
||
co_stacksize |
требуемый размер стека виртуальной машины |
||
co_varnames |
кортеж имён аргументов и локальных переменных |
||
встроенный |
doc |
строка документации |
|
name |
исходное имя этой функции или метода |
||
self |
экземпляр, к которому привязан метод, или |
Примечание:
Изменено в версии 2.2:
im_classранее ссылался на класс, который определил метод.
-
inspect.getmembers(object[, predicate])¶ Возвращает все члены объекта в виде списка пар (имя, значение), отсортированных по имени. Если передан необязательный аргумент predicate, включаются только те члены, для которых предикат возвращает истинное значение.
Примечание
getmembers()не возвращает атрибуты метакласса, когда аргумент является классом (это поведение наследуется от функцииdir()).
-
inspect.getmoduleinfo(path)¶ Возвращает кортеж значений, описывающих, как Python будет интерпретировать файл идентифицируемый путь, если это модуль, или
None, если он не будет идентифицирован как модуль. Возвращаемый кортеж –(name, suffix, mode, module_type), где name – имя модуля без имени какого-либо включающего пакета, suffix – завершающая часть имени файла (которая может не быть расширением, отделённым точкой), mode – режимopen(), который будет использован ('r'или'rb'), а module_type – целое число, задающее тип модуля. module_type будет иметь значение, которое можно сравнить с константами, определёнными в модулеimp; см. документацию этого модуля для получения дополнительной информации о типах модулей.Изменено в версии 2.6: Возвращает именованный кортеж
ModuleInfo(name, suffix, mode, module_type).
-
inspect.getmodulename(path)¶ Возвращает имя модуля, заданного файлом путь, без включения имён включающих пакетов. При этом используется тот же алгоритм, что и интерпретатор использует при поиске модулей. Если имя не может быть сопоставлено согласно правилам интерпретатора, возвращается
None.
-
inspect.ismodule(object)¶ Возвращает True, если объект является модулем.
-
inspect.isclass(object)¶ Возвращает True, если объект является классом, встроенным или созданным в коде Python.
-
inspect.ismethod(object)¶ Возвращает истину, если объект является связанным или несвязанным методом, написанным на Python.
-
inspect.isfunction(object)¶ Возвращает True, если объект является функцией Python, включая функции, созданные с помощью выражения lambda.
-
inspect.isgeneratorfunction(object)¶ Возвращает True, если объект является функцией-генератором Python.
Новое в версии 2.6.
-
inspect.isgenerator(object)¶ Возвращает True, если объект является генератором.
Новое в версии 2.6.
-
inspect.istraceback(object)¶ Возвращает True, если объект является трассировкой.
-
inspect.isframe(object)¶ Возвращает True, если объект является фреймом.
-
inspect.iscode(object)¶ Возвращает True, если объект является кодом.
-
inspect.isbuiltin(object)¶ Возвращает True, если объект является встроенной функцией или связанным встроенным методом.
-
inspect.isroutine(object)¶ Возвращает True, если объект является пользовательской или встроенной функцией или методом.
-
inspect.isabstract(object)¶ Возвращает True, если объект является абстрактным базовым классом.
Новое в версии 2.6.
-
inspect.ismethoddescriptor(object)¶ Возвращает True, если объект является дескриптором метода, но не в случае, если
ismethod(),isclass(),isfunction()илиisbuiltin()истинны.Это нововведение начиная с Python 2.2 и, например, верно для
int.__add__. Объект, проходящий эту проверку, имеет метод__get__(), но не имеет метода__set__(), однако остальной набор атрибутов различается. Атрибут__name__обычно имеет смысл, а__doc__– часто.Методы, реализованные через дескрипторы, которые также проходят один из других тестов, возвращают false для теста
ismethoddescriptor(), просто потому, что другие тесты обещают больше – например, можно рассчитывать на наличие атрибутаim_func(и т.д.), когда объект проходитismethod().
-
inspect.isdatadescriptor(object)¶ Возвращает True, если объект является дескриптором данных.
Дескрипторы данных имеют оба метода –
__get__и__set__. Примерами являются свойства (определённые в Python), getsets и members. Последние два определены в C, и для этих типов существуют более специальные проверки, что надёжно во всех реализациях Python. Обычно дескрипторы данных также имеют атрибуты__name__и__doc__(свойства, getsets и members имеют оба этих атрибута), но это не гарантируется.Новое в версии 2.3.
-
inspect.isgetsetdescriptor(object)¶ Возвращает True, если объект является дескриптором getset.
Особенность реализации CPython: getsets – это атрибуты, определённые в модулях расширения через структуры
PyGetSetDef. Для реализаций Python без таких типов этот метод всегда будет возвращатьFalse.Новое в версии 2.5.
-
inspect.ismemberdescriptor(object)¶ Возвращает True, если объект является дескриптором члена.
Особенности реализации CPython: Дескрипторы членов – это атрибуты, определённые в модулях расширения через структуры
PyMemberDef. В реализациях Python без таких типов этот метод всегда возвращаетFalse.Новое в версии 2.5.
28.13.2. Получение исходного кода¶Retrieving source code
-
inspect.getdoc(object)¶ Получить строку документации для объекта, очищенную с помощью
cleandoc().
-
inspect.getcomments(object)¶ Возвращает единой строкой все строки комментариев, непосредственно предшествующие исходному коду объекта (для класса, функции или метода) или находящиеся в начале исходного файла Python (если объект – модуль).
-
inspect.getfile(object)¶ Возвращает имя (текстового или бинарного) файла, в котором определён объект. Вызывает исключение
TypeError, если объект – встроенный модуль, класс или функция.
-
inspect.getmodule(object)¶ Пытается определить модуль, в котором был определён объект.
-
inspect.getsourcefile(object)¶ Возвращает имя файла исходного кода Python, в котором был определён объект. Вызовет исключение
TypeError, если объект является встроенным модулем, классом или функцией.
-
inspect.getsourcelines(object)¶ Возвращает список строк исходного кода и номер начальной строки для объекта. Аргументом может быть модуль, класс, метод, функция, объект трассировки, фрейм или объект кода. Исходный код возвращается в виде списка строк, соответствующих объекту, а номер строки указывает, где в исходном файле находится первая строка кода. Если исходный код не удаётся получить, возбуждается исключение
IOError.
-
inspect.getsource(object)¶ Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, объект трассировки, фрейм или объект кода. Исходный код возвращается в виде одной строки. Если исходный код не удаётся получить, возбуждается исключение
IOError.
-
inspect.cleandoc(doc)¶ Убирает отступы из docstrings, которые выровнены с блоками кода.
Из первой строки удаляются все начальные пробелы. Все начальные пробелы, которые можно равномерно удалить со второй строки и далее, также удаляются. Пустые строки в начале и конце удаляются. Кроме того, все табуляции заменяются пробелами.
Новое в версии 2.6.
28.13.3. Классы и функции¶Classes and functions
-
inspect.getclasstree(classes[, unique])¶ Упорядочивает заданный список классов в иерархию вложенных списков. Если встречается вложенный список, он содержит классы, унаследованные от класса, запись которого непосредственно предшествует этому списку. Каждая запись представляет собой кортеж из двух элементов, содержащий класс и кортеж его базовых классов. Если аргумент unique равен true, в возвращаемой структуре появляется ровно одна запись для каждого класса из заданного списка. В противном случае классы, использующие множественное наследование, и их потомки будут появляться несколько раз.
-
inspect.getargspec(func)¶ Получить имена и значения по умолчанию аргументов функции Python. Возвращается кортеж из четырёх элементов:
(args, varargs, keywords, defaults). args – это список имён аргументов (может содержать вложенные списки). varargs и keywords – это имена аргументов*и**илиNone. defaults – это кортеж значений аргументов по умолчанию илиNone, если аргументов по умолчанию нет; если этот кортеж содержит n элементов, они соответствуют последним n элементам, перечисленным в args.Изменено в версии 2.6: Возвращает именованный кортеж
ArgSpec(args, varargs, keywords, defaults).
-
inspect.getargvalues(frame)¶ Получить информацию об аргументах, переданных в определённый фрейм. Возвращается кортеж из четырёх элементов:
(args, varargs, keywords, locals). args – это список имён аргументов (может содержать вложенные списки). varargs и keywords – это имена аргументов*и**илиNone. locals – это словарь локальных переменных данного фрейма.Изменено в версии 2.6: Возвращает именованный кортеж
ArgInfo(args, varargs, keywords, locals).
-
inspect.formatargspec(args[, varargs, varkw, defaults, formatarg, formatvarargs, formatvarkw, formatvalue, join])¶ Форматирует красивое описание аргументов из четырёх значений, возвращаемых
getargspec(). Аргументы format* – это соответствующие опциональные функции форматирования, которые вызываются для преобразования имён и значений в строки.
-
inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue, join])¶ Форматирует красивое описание аргументов из четырёх значений, возвращаемых
getargvalues(). Аргументы format* – это соответствующие опциональные функции форматирования, которые вызываются для преобразования имён и значений в строки.
-
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,)} >>> getcallargs(f, a=2, x=4) {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
Новое в версии 2.7.
28.13.4. Стек интерпретатора¶The interpreter stack
Когда следующие функции возвращают «записи фреймов» (frame records), каждая запись представляет собой кортеж из шести элементов: объект фрейма, имя файла, номер текущей строки, имя функции, список строк контекста из исходного кода и индекс текущей строки в этом списке.
Примечание
Хранение ссылок на объекты фреймов (как в первом элементе записей фреймов, возвращаемых этими функциями) может привести к созданию циклических ссылок в программе. После создания циклической ссылки время жизни всех объектов, доступных из объектов, образующих цикл, может значительно увеличиться, даже если включён дополнительный детектор циклов Python. Если такие циклы необходимо создать, важно убедиться, что они явно разрываются, чтобы избежать задержки уничтожения объектов и увеличения потребления памяти.
Хотя детектор циклов поймает их, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, удалив цикл в предложении finally. Это также важно, если детектор циклов был отключён при компиляции Python или с помощью gc.disable(). Например:
def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# Выполнить действие с фреймом
finally:
del frame
Необязательный аргумент context, поддерживаемый большинством этих функций, задаёт количество возвращаемых строк контекста, которые располагаются вокруг текущей строки.
-
inspect.getframeinfo(frame[, context])¶ Получить информацию об объекте фрейма или трассировки. Возвращается 5-кортеж, содержащий последние пять элементов записи фрейма.
Изменено в версии 2.6: Возвращает именованный кортеж
Traceback(filename, lineno, function, code_context, index).
-
inspect.getouterframes(frame[, context])¶ Возвращает список записей о фреймах для фрейма и всех внешних фреймов. Эти фреймы представляют вызовы, которые привели к созданию frame. Первый элемент возвращаемого списка представляет frame; последний элемент представляет самый внешний вызов в стеке frame.
-
inspect.getinnerframes(traceback[, context])¶ Возвращает список записей о фреймах для фрейма traceback и всех внутренних фреймов. Эти фреймы представляют вызовы, являющиеся следствием frame. Первый элемент списка представляет traceback; последний элемент представляет место, где было возбуждено исключение.
-
inspect.currentframe()¶ Возвращает объект фрейма для фрейма стека вызывающего.
Особенность реализации CPython: Эта функция полагается на поддержку фреймов стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python. Если запустить в реализации без поддержки фреймов стека Python, эта функция возвращает
None.
-
inspect.stack([context])¶ Возвращает список записей о фреймах для стека вызывающего кода. Первый элемент возвращаемого списка представляет вызывающий код; последний элемент представляет самый внешний вызов в стеке.
-
inspect.trace([context])¶ Возвращает список записей о фреймах для стека между текущим фреймом и фреймом, в котором было возбуждено исключение, обрабатываемое в данный момент. Первый элемент списка представляет вызывающий код; последний элемент представляет место, где было возбуждено исключение.