inspect — Просмотр живых объектов
Новая версия 2.1.
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, он может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.
Этот модуль предоставляет четыре основных типа услуг: проверку типов, получение исходного кода, инспекцию классов и функций и изучение стека интерпретатора.
1. Типы и члены
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Шестнадцать функций, имена которых начинаются с «is», в основном предоставляются в качестве удобных вариантов для второго аргумента функции getmembers(). Они также помогают определить, когда вы можете ожидать найти следующие специальные атрибуты:
Тип | Атрибут | Описание | Примечания |
|---|---|---|---|
модуль | __doc__ | строка документации | |
__file__ | имя файла (отсутствует для встроенных модулей) | ||
класс | __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 в противном случае | ||
next | возвращает следующий элемент из контейнера | ||
send | возобновляет генератор и «отправляет» значение, которое становится результатом текущего выражения yield | ||
throw | используется для создания исключения внутри генератора | ||
трассировка | tb_frame | объект фрейма на этом уровне | |
tb_lasti | индекс последней попытки инструкции в байт-коде | ||
tb_lineno | текущий номер строки в исходном коде Python | ||
tb_next | следующий внутренний объект трассировки (вызываемый на этом уровне) | ||
фрейм | f_back | следующий внешний объект фрейма (вызывающий этого фрейма) | |
f_builtins | пространство имён встроенных функций, видимое этим фреймом | ||
f_code | объект кода, выполняемый в этом фрейме | ||
f_exc_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 будет интерпретировать файл, указанный в path, если это модуль, или
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) -
Возвращает имя модуля, указанного в файле path, без включения имён содержащих пакетов. Используется тот же алгоритм, что и интерпретатор использует при поиске модулей. Если имя не может быть сопоставлено в соответствии с правилами интерпретатора, возвращается
None.
-
inspect.ismodule(object) -
Возвращает true, если объект является модулем.
-
inspect.isclass(object) -
Возвращает true, если объект является классом, встроенным или созданным в коде Python.
-
inspect.ismethod(object) -
Возвращает True, если объект является связанным или несвязанным методом, написанным на Python.
-
inspect.isfunction(object) -
Возвращает True, если объект является функцией Python, что включает функции, созданные с помощью выражения лямбда.
-
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__часто есть.Методы, реализованные через описатели, которые также проходят один из других тестов, возвращают ложь из теста
ismethoddescriptor(), просто потому, что другие тесты обещают больше – например, можно рассчитывать на наличие атрибутаim_func(и т. д.), когда объект проходитismethod().
-
inspect.isdatadescriptor(object) -
Возвращает True, если объект является описателем данных.
Описатели данных имеют как метод
__get__, так и метод__set__. Примеры: свойства (определённые в Python), getset и члены. Последние два определяются в C, и для этих типов доступны более специфичные тесты, которые надёжны в разных реализациях Python. Обычно у описателей данных также будут атрибуты__name__и__doc__(у свойств, getset и членов есть оба эти атрибута), но это не гарантировано.Новая в версии 2.3.
-
inspect.isgetsetdescriptor(object) -
Возвращает True, если объект является описателем getset.
Деталь реализации CPython: getset — это атрибуты, определённые в модулях расширения с помощью структур
PyGetSetDef. В реализациях Python без таких типов этот метод всегда возвращаетFalse.Новая в версии 2.5.
-
inspect.ismemberdescriptor(object) -
Возвращает True, если объект является описателем члена.
Деталь реализации CPython: Описатели членов — это атрибуты, определённые в модулях расширения с помощью структур
PyMemberDef. В реализациях Python без таких типов этот метод всегда возвращаетFalse.Новая в версии 2.5.
2. Получение исходного кода
-
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) -
Очищает отступы в строках документации, которые выровнены с блоками кода.
Все начальные пробелы удаляются из первой строки. Все начальные пробелы, которые можно единообразно удалить из второй и последующих строк, удаляются. Пустые строки в начале и конце также удаляются. Также все табуляции заменяются на пробелы.
Новая в версии 2.6.
3. Классы и функции
-
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, в порядке разрешения методов. В этом кортеже каждый класс встречается не более одного раза. Обратите внимание, что порядок разрешения методов зависит от типа cls. Если не используется какой-то необычный пользовательский метатип, cls будет первым элементом кортежа.
-
inspect.getcallargs(func[, *args][, **kwds]) -
Связывает args и kwds с именами аргументов Python-функции или метода func, как если бы она была вызвана с ними. Для связанных методов также связывает первый аргумент (обычно названный
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.
4. Стек интерпретатора
Когда следующие функции возвращают «записи кадра», каждая запись представляет собой кортеж из шести элементов: объект кадра, имя файла, номер строки текущей строки, имя функции, список строк контекста из исходного кода и индекс текущей строки в этом списке.
Примечание
Сохранение ссылок на объекты кадров, как в первом элементе записей кадров, возвращаемых этими функциями, может привести к созданию циклов ссылок в вашей программе. После создания цикла ссылок время жизни всех объектов, на которые можно получить доступ из объектов, образующих цикл, может значительно увеличиться, даже если включён необязательный детектор циклов Python. Если такие циклы должны быть созданы, важно убедиться, что они явно разорваны, чтобы избежать задержки уничтожения объектов и увеличения потребления памяти.
Хотя детектор циклов и обнаружит их, уничтожение кадров (и локальных переменных) можно сделать детерминированным, удалив цикл в блоке finally. Это также важно, если детектор циклов был отключен при компиляции Python или с помощью gc.disable(). Например:
def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# do something with the frame
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]) -
Возвращает список записей кадров для кадра трассировки исключения и всех внутренних кадров. Эти кадры представляют вызовы, сделанные в результате frame. Первый элемент списка представляет traceback; последний элемент представляет собой место, где произошло исключение.
-
inspect.currentframe() -
Возвращает объект кадра для кадра стека вызовов вызывающего кода.
Детали реализации CPython: Эта функция полагается на поддержку кадров стека Python в интерпретаторе, что не гарантируется во всех реализациях Python. Если выполняется в реализации без поддержки кадров стека Python, эта функция возвращает
None.
-
inspect.stack([context]) -
Возвращает список записей кадров для стека вызовов вызывающего кода. Первый элемент возвращаемого списка представляет вызывающий код; последний элемент представляет собой самый внешний вызов в стеке.
-
inspect.trace([context]) -
Возвращает список записей кадров для стека вызовов между текущим кадром и кадром, в котором в настоящее время обрабатывается исключение, было поднято. Первый элемент списка представляет вызывающий код; последний элемент представляет собой место, где произошло исключение.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/inspect.html