inspect — Просмотр живых объектов
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, он может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.
Этот модуль предоставляет четыре основных типа сервисов: проверку типов, получение исходного кода, инспекцию классов и функций и просмотр стека интерпретатора.
Типы и члены
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобных вариантов для второго аргумента функции getmembers(). Они также помогают определить, когда вы можете ожидать найти следующие специальные атрибуты:
Тип | Атрибут | Описание |
|---|---|---|
модуль | __doc__ | строка документации |
__file__ | имя файла (отсутствует для встроенных модулей) | |
класс | __doc__ | строка документации |
__name__ | имя, с которым был определён этот класс | |
__qualname__ | полное имя | |
__module__ | имя модуля, в котором был определён этот класс | |
метод | __doc__ | строка документации |
__name__ | имя, с которым был определён этот метод | |
__qualname__ | полное имя | |
__func__ | объект функции, содержащий реализацию метода | |
__self__ | экземпляр, к которому привязан этот метод, или | |
__module__ | имя модуля, в котором был определён этот метод | |
функция | __doc__ | строка документации |
__name__ | имя, с которым была определена эта функция | |
__qualname__ | полное имя | |
__code__ | объект кода, содержащий скомпилированную функцию байткод | |
__defaults__ | кортеж любых значений по умолчанию для позиционных или именованных параметров | |
__kwdefaults__ | отображение любых значений по умолчанию для именованных-только параметров | |
__globals__ | глобальное пространство имён, в котором была определена эта функция | |
__annotations__ | отображение имён параметров на аннотации; | |
__module__ | имя модуля, в котором была определена эта функция | |
трассировка | 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 | код | |
cr_origin | где была создана корутина, или | |
встроенная | __doc__ | строка документации |
__name__ | исходное имя этой функции или метода | |
__qualname__ | полное имя | |
__self__ | экземпляр, к которому привязан метод, или |
Изменено в версии 3.5: Добавлены атрибуты __qualname__ и gi_yieldfrom для генераторов.
Атрибут __name__ генераторов теперь устанавливается из имени функции, а не имени кода, и теперь его можно изменить.
Изменено в версии 3.7: Добавлен атрибут cr_origin для корутин.
-
inspect.getmembers(object[, predicate]) -
Возвращает все члены объекта в виде списка пар (имя, значение), отсортированных по имени. Если передан необязательный аргумент predicate, возвращаются только члены, для которых predicate возвращает значение истинности.
Примечание
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, включая функции, созданные с помощью выражения лямбда.
-
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 и члены. Последние два определяются в C, и для этих типов доступны более специфичные тесты, что устойчиво работает в разных реализациях Python. Обычно описатели данных также будут иметь атрибуты__name__и__doc__(свойства, getsets и члены имеют оба этих атрибута), но это не гарантируется.
-
inspect.isgetsetdescriptor(object) -
Возвращает
True, если объект является описателем getset.Подробность реализации CPython: getsets — это атрибуты, определенные в модулях расширения с помощью структур
PyGetSetDef. Для реализаций Python без таких типов этот метод всегда вернётFalse.
-
inspect.ismemberdescriptor(object) -
Возвращает
True, если объект является описателем члена.Подробность реализации CPython: Описатели членов — это атрибуты, определенные в модулях расширения с помощью структур
PyMemberDef. Для реализаций Python без таких типов этот метод всегда вернётFalse.
Получение исходного кода
-
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) -
Очищает отступы из строковых документов, которые отступы выровнены с блоками кода.
Все начальные пробелы удаляются из первой строки. Любые начальные пробелы, которые можно одинаково удалить со второй строки и далее, удаляются. Пустые строки в начале и конце также удаляются. Кроме того, все табуляции расширяются до пробелов.
Инспектирование вызываемых объектов с помощью объекта 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, если этот тип объекта не поддерживается.Слэш(/) в сигнатуре функции указывает, что параметры перед ним являются только позиционными. Для получения дополнительной информации см. запись FAQ о позиционных-только параметрах.
Новое в версии 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. Параметры появляются в строгом порядке объявления, включая именованные-только параметры.Изменено в версии 3.7: Python гарантирует только сохранение порядка объявления именованных-только параметров начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.
-
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, основанный на экземпляре, на котором был вызван метод 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 - Объект сигнатуры функции.
-
Подробное описание, детали реализации и примеры.
Классы и функции
-
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: Используйте
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 модуля Python 2inspect.Изменено в версии 3.4: Эта функция теперь основана на
signature(), но по-прежнему игнорирует__wrapped__атрибуты и включает уже связанный первый параметр в выходные данные сигнатуры для связанных методов.Изменено в версии 3.6: Этот метод ранее был документирован как устаревший в пользу
signature()в Python 3.5, но это решение было пересмотрено, чтобы восстановить чётко поддерживаемый стандартный интерфейс для кода Python 2/3 с одним источником, мигрирующего от устаревшего APIgetargspec().Изменено в версии 3.7: Python гарантировал явное сохранение порядка объявления только-именованных параметров начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.
-
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.
Стек интерпретатора
Когда следующие функции возвращают «записи кадра», каждая запись — именованная кортеж 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).
Статическое получение атрибутов
Как 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
Текущее состояние генераторов и корутин
При реализации планировщиков корутин и других расширенных случаях использования генераторов полезно определить, выполняется ли генератор в данный момент, ожидает ли он начала или возобновления выполнения или уже завершился. 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.
Флаги кодовых объектов модуля inspect
Кодовые объекты 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 для любых потребностей интроспекции.
Интерфейс командной строки
Модуль inspect также предоставляет базовые возможности интроспекции из командной строки.
По умолчанию принимает имя модуля и выводит исходный код этого модуля. Класс или функция внутри модуля могут быть выведены вместо этого, если добавить двоеточие и полное имя целевого объекта.
-
--details -
Вывести информацию о указанном объекте вместо исходного кода
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/inspect.html