inspect — Просмотр активных объектов
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций для получения информации об активных объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, он может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.
Этот модуль предоставляет четыре основных вида сервисов: проверку типов, получение исходного кода, проверку классов и функций, а также проверку стека интерпретатора.
29.12.1. Типы и члены
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобного выбора для второго аргумента функции getmembers(). Они также помогают определить, когда можно ожидать найти следующие специальные атрибуты:
Тип | Атрибут | Описание |
|---|---|---|
модуль | __doc__ | строка документации |
__file__ | имя файла (отсутствует для встроенных модулей) | |
класс | __doc__ | строка документации |
__name__ | имя, с которым был определен этот класс | |
__qualname__ | полное имя | |
__module__ | имя модуля, в котором был определен этот класс | |
метод | __doc__ | строка документации |
__name__ | имя, с которым был определен этот метод | |
__qualname__ | полное имя | |
__func__ | объект функции, содержащий реализацию метода | |
__self__ | экземпляр, к которому привязан этот метод, или | |
функция | __doc__ | строка документации |
__name__ | имя, с которым была определена эта функция | |
__qualname__ | полное имя | |
__code__ | объект кода, содержащий скомпилированную функцию байткод | |
__defaults__ | кортеж любых значений по умолчанию для позиционных или именованных параметров | |
__kwdefaults__ | отображение любых значений по умолчанию для именованных параметров | |
__globals__ | глобальное пространство имен, в котором была определена эта функция | |
__annotations__ | отображение имен параметров к аннотациям; | |
трассировка | tb_frame | объект фрейма на этом уровне |
tb_lasti | индекс последней попытки выполнения инструкции в байткоде | |
tb_lineno | текущий номер строки в исходном коде Python | |
tb_next | следующий внутренний объект трассировки (вызван на этом уровне) | |
фрейм | f_back | следующий внешний объект фрейма (вызывающий данного фрейма) |
f_builtins | пространство имен встроенных функций, видимое этим фреймом | |
f_code | объект кода, выполняемый в этом фрейме | |
f_globals | глобальное пространство имен, видимое этим фреймом | |
f_lasti | индекс последней попытки выполнения инструкции в байткоде | |
f_lineno | текущий номер строки в исходном коде Python | |
f_locals | локальное пространство имен, видимое этим фреймом | |
f_trace | функция отслеживания для этого фрейма, или | |
код | co_argcount | количество аргументов (без учета аргументов только по имени, * или ** args) |
co_code | строка необработанного скомпилированного байткода | |
co_cellvars | кортеж имен переменных ячейки (ссылаются содержащими областями) | |
co_consts | кортеж констант, используемых в байткоде | |
co_filename | имя файла, в котором был создан этот объект кода | |
co_firstlineno | номер первой строки в исходном коде Python | |
co_flags | битовая карта | |
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 | объект, по которому выполняется итерация | |
корутина | __name__ | имя |
__qualname__ | полное имя | |
cr_await | объект, по которому ожидание, или | |
cr_frame | фрейм | |
cr_running | запущена ли корутина? | |
cr_code | код | |
встроенная функция | __doc__ | строка документации |
__name__ | исходное имя этой функции или метода | |
__qualname__ | полное имя | |
__self__ | экземпляр, к которому привязан метод, или |
Изменено в версии 3.5: Добавлены __qualname__ и gi_yieldfrom атрибуты для генераторов.
Атрибут __name__ генераторов теперь устанавливается из имени функции, а не из имени кода, и теперь его можно изменить.
-
inspect.getmembers(object[, predicate]) -
Возвращает все члены объекта в списке пар (имя, значение), отсортированных по имени. Если задан необязательный аргумент predicate, включаются только члены, для которых predicate возвращает значение True.
Примечание
getmembers()будет возвращать только атрибуты класса, определенные в метаклассе, когда аргумент является классом, и эти атрибуты были перечислены в пользовательском__dir__()метакласса.
-
inspect.getmodulename(path) -
Возвращает имя модуля, названного путем path, без включения имен вложенных пакетов. Расширение файла проверяется по всем записям в
importlib.machinery.all_suffixes(). Если оно совпадает, возвращается последняя часть пути с удаленным расширением. В противном случае возвращаетсяNone.Обратите внимание, что эта функция только возвращает осмысленное имя для фактических модулей Python — пути, которые потенциально ссылаются на пакеты Python, по-прежнему будут возвращать
None.Изменено в версии 3.3: Функция основана непосредственно на
importlib.
-
inspect.ismodule(object) -
Возвращает True, если объект является модулем.
-
inspect.isclass(object) -
Возвращает True, если объект является классом, будь то встроенный или созданный в коде Python.
-
inspect.ismethod(object) -
Возвращает True, если объект является связанным методом, написанным на Python.
-
inspect.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.isasyncgenfunction(object) -
Возвращает True, если объект является функцией-генератором асинхронного генератора, например:
>>> async def agen(): ... yield 1 ... >>> inspect.isasyncgenfunction(agen) True
Новая в версии 3.6.
-
inspect.isasyncgen(object) -
Возвращает True, если объект является итератором асинхронного генератора, созданным функцией асинхронного генератора.
Новая в версии 3.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, если объект является абстрактным базовым классом.
-
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, если объект является дескриптором member.
Деталь реализации CPython: Дескрипторы member — это атрибуты, определённые в расширениях модулей посредством структур
PyMemberDef. Для реализаций Python без таких типов этот метод всегда вернётFalse.
29.12.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) -
Очистка отступов в строках документации, которые выровнены с блоками кода.
Все начальные пробелы удаляются из первой строки. Любые начальные пробелы, которые можно одинаково удалить со второй строки и далее, удаляются. Пустые строки в начале и конце также удаляются. Кроме того, все табуляции расширяются до пробелов.
29.12.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для переопределения соответствующих свойств исходной сигнатуры. Чтобы удалить return_annotation из скопированной Signature, передайте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.
Деталь реализации CPython: CPython генерирует неявные имена параметров в формате
.0для кодовых объектов, используемых для реализации генераторов и списков с пониманием.Изменено в версии 3.6: Эти имена параметров доступны в этом модуле как имена вида
implicit0.
-
default -
Значение по умолчанию для параметра. Если у параметра нет значения по умолчанию, этот атрибут установлен в
Parameter.empty.
-
annotation -
Аннотация для параметра. Если у параметра нет аннотации, этот атрибут установлен в
Parameter.empty.
-
kind -
Описание того, как значения аргументов связываются с параметром. Возможные значения (доступные через
Parameter, например,Parameter.KEYWORD_ONLY):Имя
Значение
POSITIONAL_ONLY
Значение должно быть передано как позиционный аргумент.
Python не имеет явного синтаксиса для определения позиционных параметров, но многие встроенные и модульные функции (особенно те, которые принимают один или два параметра) их поддерживают.
POSITIONAL_OR_KEYWORD
Значение может быть передано как именованный или позиционный аргумент (это стандартное поведение связывания для функций, реализованных на Python.)
VAR_POSITIONAL
Кортеж позиционных аргументов, которые не связаны с другими параметрами. Это соответствует параметру
*argsв определении функции Python.KEYWORD_ONLY
Значение должно быть передано как именованный аргумент. Именованные параметры — это те, которые появляются после записи
*или*argsв определении функции Python.VAR_KEYWORD
Словарь именованных аргументов, которые не связаны с другими параметрами. Это соответствует параметру
**kwargsв определении функции Python.Пример: выведите все именованные аргументы без значений по умолчанию:
>>> 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()) # 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 - Объект сигнатуры функции.
-
Подробное описание, детали реализации и примеры.
29.12.4. Классы и функции
-
inspect.getclasstree(classes, unique=False) -
Разместите данный список классов в иерархии вложенных списков. Где появляется вложенный список, он содержит классы, производные от класса, запись которого непосредственно предшествует списку. Каждый элемент представляет собой пару 2-кортежей, содержащую класс и кортеж его базовых классов. Если аргумент unique имеет значение
True, в возвращаемой структуре для каждого класса в данном списке будет присутствовать ровно одна запись. В противном случае классы, использующие множественное наследование, и их потомки будут появляться несколько раз.
-
inspect.getargspec(func) -
Получение имён и значений по умолчанию параметров функции Python. Возвращается named tuple
ArgSpec(args, varargs, keywords, defaults). args — список имён параметров. varargs и keywords — имена параметров*и**илиNone. defaults — кортеж значений аргументов по умолчанию илиNone, если аргументы по умолчанию отсутствуют; если этот кортеж содержит n элементов, они соответствуют последним n элементам в args.Устарело начиная с версии 3.0: Используйте
getfullargspec()для обновлённого API, который обычно является прямым заменой, но также правильно обрабатывает аннотации функций и именованные параметры.В качестве альтернативы используйте
signature()и Объект сигнатуры, которые предоставляют более структурированный API для интроспекции вызываемых объектов.
-
inspect.getfullargspec(func) -
Получить имена и значения по умолчанию параметров Python-функции. Возвращается именованная кортеж:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)args — список имён позиционных параметров. varargs — имя
*параметра илиNone, если произвольные позиционные аргументы не принимаются. varkw — имя**параметра илиNone, если произвольные именованные аргументы не принимаются. defaults — кортеж длиной n значений по умолчанию для последних n позиционных параметров илиNone, если такие значения не определены. kwonlyargs — список имён параметров только по ключевым словам. kwonlydefaults — словарь, сопоставляющий имена параметров из kwonlyargs их значениям по умолчанию, используемым при отсутствии аргументов. annotations — словарь, сопоставляющий имена параметров их аннотациям. Специальный ключ"return"используется для указания аннотации значения возвращаемого функцией (если она есть).Обратите внимание, что
signature()и Объект Signature предоставляют рекомендуемый API для интроспекции вызываемых объектов и поддерживают дополнительные возможности (например, позиционные-только аргументы), которые иногда встречаются в API модулей расширений. Эта функция сохранена в основном для использования в коде, которому требуется сохранять совместимость с API модуляinspectPython 2.Изменено в версии 3.4: Теперь эта функция основана на
signature(), но по-прежнему игнорирует__wrapped__атрибуты и включает первый уже связанный параметр в выходные данные подписи для связанных методов.Изменено в версии 3.6: Этот метод ранее был задокументирован как устаревший в пользу
signature()в Python 3.5, но это решение было пересмотрено, чтобы восстановить чётко поддерживаемый стандартный интерфейс для кода Python 2/3 из одного источника при переходе от устаревшего APIgetargspec().
-
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]]) -
Форматировать красивое описание аргументов из значений, возвращаемых
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, которые предоставляют лучший 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.
29.12.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) -
Получение списка записей о кадре для кадра и всех внешних кадров. Эти кадры представляют вызовы, которые привели к созданию кадра. Первый элемент в возвращаемом списке представляет кадр; последний элемент представляет самый внешний вызов в стеке кадра.
Изменено в версии 3.5: Возвращается список именованных кортежей
FrameInfo(frame, filename, lineno, function, code_context, index).
-
inspect.getinnerframes(traceback, context=1) -
Получение списка записей о кадре для кадра отслеживания ошибок и всех внутренних кадров. Эти кадры представляют вызовы, сделанные в результате работы кадра. Первый элемент в списке представляет отслеживание ошибок; последний элемент представляет место, где было поднято исключение.
Изменено в версии 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. Статическое извлечение атрибутов
Оба 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
29.12.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.
29.12.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, и могут преобразовываться в объекты генераторов-генераторов. Подробнее см. PEP 492.Введено в версии 3.5.
-
inspect.CO_ASYNC_GENERATOR -
Флаг устанавливается, когда объект кода является асинхронной функцией-генератором. При выполнении объекта кода он возвращает объект асинхронного генератора. Подробнее см. PEP 525.
Введено в версии 3.6.
Примечание
Флаги специфичны для CPython и могут не быть определены в других реализациях Python. Кроме того, флаги являются деталями реализации и могут быть удалены или устаревшими в будущих выпусках Python. Рекомендуется использовать публичные API из модуля inspect для любых потребностей интроспекции.
29.12.9. Интерфейс командной строки
Модуль inspect также предоставляет базовые возможности интроспекции из командной строки.
По умолчанию принимает имя модуля и выводит исходный код этого модуля. Класс или функция внутри модуля могут быть выведены вместо этого путем добавления двоеточия и квалифицированного имени целевого объекта.
-
--details -
Вывести информацию о заданном объекте, а не исходный код
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/inspect.html