inspect — Просмотр живых объектов
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, он может помочь вам исследовать содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.
Этот модуль предоставляет четыре основных типа услуг: проверка типов, получение исходного кода, инспектирование классов и функций и проверка стека интерпретатора.
1. Типы и члены
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобных вариантов для второго аргумента функции getmembers(). Они также помогают определить, когда можно ожидать найти следующие специальные атрибуты:
| Тип | Атрибут | Описание |
|---|---|---|
| модуль | __doc__ | строка документации |
| __file__ | имя файла (отсутствует для встроенных модулей) | |
| класс | __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 | следующий внутренний объект трассировки (вызванный на этом уровне) | |
| фрейм | 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 | количество аргументов (без учета аргументов только для ключевых слов, * или ** аргументов) |
| co_code | строка исходного скомпилированного байт-кода | |
| co_cellvars | кортеж имен переменных ячеек (ссылающихся на содержащие области видимости) | |
| co_consts | кортеж констант, используемых в байт-коде | |
| co_filename | имя файла, в котором был создан этот объект кода | |
| co_firstlineno | номер первой строки в исходном коде Python | |
| co_flags | битовая карта CO_* флагов, подробнее здесь
| |
| co_lnotab | закодированное отображение номеров строк к индексам байт-кода | |
| co_freevars | кортеж имен свободных переменных (ссылающихся через замыкание функции) | |
| co_kwonlyargcount | количество аргументов только для ключевых слов (без учета ** аргумента) | |
| 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 — конечная часть имени файла (которая может не быть разделяемой точкой расширением), mode — режимopen(), который будет использоваться ('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, включая функции, созданные с помощью выражения лямбда.
-
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()имеют значение True.Например, это верно для
int.__add__. Объект, проходящий этот тест, имеет метод__get__(), но не метод__set__(), но набор атрибутов варьируется. Атрибут__name__обычно имеет смысл, и__doc__часто тоже.Методы, реализованные через описатели, которые также проходят один из других тестов, возвращают False от теста
ismethoddescriptor(), просто потому что другие тесты обещают больше – вы можете, например, полагаться на наличие атрибута__func__(и т. д.) когда объект проходит тестismethod().
-
inspect.isdatadescriptor(object) -
Возвращает True, если объект является описателем данных.
Описатели данных имеют и метод
__get__, и метод__set__. Примерами являются свойства (определённые на Python), getset и члены. Последние два определены в C, и для них есть более специфичные тесты, которые надёжны в разных реализациях Python. Как правило, описатели данных также будут иметь атрибуты__name__и__doc__, (свойства, getset и члены имеют оба эти атрибута), но это не гарантируется.
-
inspect.isgetsetdescriptor(object) -
Возвращает True, если объект является описателем getset.
Деталь реализации CPython: getset являются атрибутами, определёнными в расширяемых модулях через структуры
PyGetSetDef. В реализациях Python без таких типов этот метод всегда возвращаетFalse.
-
inspect.ismemberdescriptor(object) -
Возвращает True, если объект является описателем члена.
Деталь реализации CPython: Описатели членов являются атрибутами, определёнными в расширяемых модулях через структуры
PyMemberDef. В реализациях Python без таких типов этот метод всегда возвращаетFalse.
2. Получение исходного кода
-
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, если исходный код не может быть получен.
-
inspect.getsource(object) -
Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, трассировка, фрейм или объект кода. Исходный код возвращается как одна строка. Возникает ошибка
OSError, если исходный код не может быть получен.
-
inspect.cleandoc(doc) -
Очищает отступы из строк документации, которые отступы для выравнивания с блоками кода.
Все начальные пробелы удаляются из первой строки. Любые начальные пробелы, которые можно равномерно удалить из второй строки и далее, удаляются. Пустые строки в начале и конце удаляются. Также все табуляции заменяются пробелами.
3. Инспектирование вызываемых объектов с помощью объекта Signature
Новая версия с 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 -
Аннотация «возврат» для вызываемого объекта. Если у вызываемого объекта нет аннотации «возврат», этот атрибут устанавливается в
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для переопределения соответствующих свойств исходной сигнатуры. Для удаления аннотации возврата из скопированной сигнатуры передайте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, основанный на экземпляре, для которого был вызван метод replace. Чтобы переопределить атрибут
Parameter, передайте соответствующий аргумент. Чтобы удалить значение по умолчанию и/или аннотацию из Parameter, передайтеParameter.empty.>>> from inspect import Parameter >>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42) >>> str(param) 'foo=42' >>> str(param.replace()) # Will create a shallow copy of '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 - Объект сигнатуры функции.
- Подробное описание, реализация и примеры.
4. Классы и функции
-
inspect.getclasstree(classes, unique=False) -
Выстраивает заданный список классов в иерархию вложенных списков. Вложенные списки содержат классы, производные от класса, запись которого непосредственно предшествует списку. Каждая запись — это кортеж из 2 элементов: класс и кортеж его базовых классов. Если аргумент unique имеет значение true, в возвращаемой структуре для каждого класса из заданного списка появляется ровно одна запись. В противном случае классы с множественной наследованием и их потомки будут появляться несколько раз.
-
inspect.getargspec(func) -
Возвращает имена и значения по умолчанию аргументов Python-функции. Возвращается именованный кортеж
ArgSpec(args, varargs, keywords, defaults). args — список имён аргументов. varargs и keywords — имена*и**аргументов илиNone. defaults — кортеж значений аргументов по умолчанию илиNoneесли аргументов по умолчанию нет; если в этом кортеже n элементов, они соответствуют последним n элементам в списке args.Устарело начиная с версии 3.0: Используйте
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()и Объект сигнатуры, которые предоставляют более удобный 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()и Объект сигнатуры, которые предоставляют более удобный API для интроспекции вызываемых объектов.
-
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)вызывает исключение из-за несовместимой сигнатуры, генерируется исключение того же типа и с таким же или похожим сообщением. Например:>>> 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.
5. Стек интерпретатора
При возврате «записей фрейма» этими функциями каждая запись представляет собой кортеж с именами FrameInfo(frame, filename, lineno, function, code_context, index). Кортеж содержит объект фрейма, имя файла, номер строки текущей строки, имя функции, список строк контекста из исходного кода и индекс текущей строки в этом списке.
Изменено в версии 3.5: Возвращается кортеж с именами вместо кортежа.
Примечание
Сохранение ссылок на объекты фреймов, как в первом элементе записей фреймов, возвращаемых этими функциями, может привести к созданию циклов ссылок в вашей программе. После создания цикла ссылок срок службы всех объектов, к которым можно получить доступ из объектов, образующих цикл, может значительно увеличиться, даже если включён необязательный детектор циклов Python. Если такие циклы необходимо создать, важно обеспечить их явное разрыв, чтобы избежать отложенного уничтожения объектов и увеличения потребления памяти.
Хотя детектор циклов обнаружит это, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, прервав цикл в блоке finally. Это также важно, если детектор циклов был отключён при компиляции Python или с использованием gc.disable(). Например:
def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# do something with the frame
finally:
del frame
Если вы хотите сохранить фрейм (например, для печати трассировки позже), вы также можете разорвать циклы ссылок, используя метод frame.clear().
Необязательный аргумент context, поддерживаемый большинством этих функций, задаёт количество строк контекста для возврата, которые центрированы вокруг текущей строки.
-
inspect.getframeinfo(frame, context=1) -
Получить информацию об объекте фрейма или трассировки. Возвращается кортеж с именами
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) -
Получить список записей фрейма для фрейма трассировки и всех внутренних фреймов. Эти фреймы представляют вызовы, сделанные в результате 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).
6. Статическое извлечение атрибутов
Как 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 вызов этих методов может привести к выполнению кода:
# example code for resolving the builtin descriptor types
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:
# descriptors can raise AttributeError to
# indicate there is no underlying value
# in which case the descriptor itself will
# have to do
pass
7. Текущее состояние генераторов и корутин
При реализации планировщиков корутин и для других расширенных применений генераторов полезно определить, выполняется ли генератор в данный момент, ожидает ли он начала или возобновления выполнения или уже завершился. 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) -
Получение отображения живых локальных переменных в генераторе и их текущих значений. Возвращается словарь, сопоставляющий имена переменных со значениями. Это эквивалентно вызову
locals()в теле генератора, и все те же оговорки применимы.Если генератор — это генератор без текущей связанной фрейма, то возвращается пустой словарь.
TypeErrorгенерируется, если генератор не является объектом Python генератора.Подробности реализации CPython: Эта функция полагается на то, что генератор предоставляет фрейм стека Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда вернёт пустой словарь.
Введено в версии 3.3.
-
inspect.getcoroutinelocals(coroutine) -
Эта функция аналогична
getgeneratorlocals(), но работает для объектов корутин, созданных функциямиasync def.Введено в версии 3.5.
8. Флаги кода объектов
Объекты кода 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 для любых потребностей в интроспекции.
9. Командная строка
Модуль inspect также предоставляет базовые возможности интроспекции из командной строки.
По умолчанию принимает имя модуля и выводит исходный код этого модуля. Можно вывести класс или функцию внутри модуля, добавив двоеточие и полное имя целевого объекта.
-
--details -
Вывести информацию о заданном объекте вместо исходного кода
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/inspect.html