inspect
— Осматривать живые объекты¶
Исходный код: Lib/inspect.py
Модуль inspect
предоставляет несколько полезных функций, помогающих получать информацию о живых объектах, таких как модули, классы, методы, функции, обратные трассировки, объекты фреймов и объекты кода. Например, это может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной обратной трассировки.
Этот модуль предоставляет четыре основных вида услуг: проверка типов, получение исходного кода, проверка классов и функций и проверка стека интерпретатора.
Типы и члены¶
Функция getmembers()
извлекает элементы объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобных вариантов для второго аргумента getmembers()
. Они также помогут вам определить, когда вы можете ожидать появления следующих специальных атрибутов (атрибуты модуля см. в разделе Атрибуты модуля, связанные с импортом).:
Тип |
Атрибут |
Описание |
---|---|---|
класс |
__док__ |
строка документации |
__name__ |
имя, с помощью которого был определен этот класс |
|
__квалификатор__ |
полное имя |
|
__модуль__ |
имя модуля, в котором был определен этот класс |
|
метод |
__док__ |
строка документации |
__name__ |
имя, с помощью которого был определен этот метод |
|
__квалификатор__ |
полное имя |
|
__функция__ |
функциональный объект, содержащий реализацию метода |
|
__self__ |
экземпляр, к которому привязан этот метод, или |
|
__модуль__ |
имя модуля, в котором был определен этот метод |
|
функция |
__док__ |
строка документации |
__name__ |
имя, с помощью которого была определена эта функция |
|
__квалификатор__ |
полное имя |
|
__код__ |
объект кода, содержащий скомпилированную функцию bytecode |
|
__defaults__ |
набор любых значений по умолчанию для позиционных параметров или параметров ключевых слов |
|
__kwdefaults значения по умолчанию__ |
сопоставление любых значений по умолчанию для параметров, зависящих только от ключевых слов |
|
__globals__ |
глобальное пространство имен, в котором была определена эта функция |
|
__builtins__ |
встроенное пространство имен |
|
__аннотации__ |
сопоставление имен параметров с аннотациями; |
|
__модуль__ |
название модуля, в котором была определена эта функция |
|
обратная связь |
tb_фрейм |
обрамление объекта на этом уровне |
tb_ласти |
индекс последней выполненной команды в байт-коде |
|
tb_линено |
текущий номер строки в исходном коде Python |
|
tb_next (продолжение ) |
следующий внутренний объект обратной трассировки (вызываемый этим уровнем) |
|
рамка |
f_back (обратная связь) |
следующий объект внешнего фрейма (вызывающий объект этого фрейма) |
f_buildins (встроенные элементы) |
встроенное пространство имен, видимое этим фреймом |
|
f_код |
код объекта, выполняемого в этом фрейме |
|
f_глобалы |
глобальное пространство имен, видимое этим фреймом |
|
ф_ласти |
индекс последней выполненной команды в байт-коде |
|
f_линено |
текущий номер строки в исходном коде Python |
|
f_локали |
локальное пространство имен, видимое этим фреймом |
|
f_trace (трассировка) |
функция трассировки для этого кадра, или |
|
код |
co_argcount - количество аргументов |
количество аргументов (не включая аргументы только для ключевых слов, аргументы * или **) |
код co_code |
строка необработанного скомпилированного байт-кода |
|
со_целлвары |
набор имен переменных ячейки (на которые ссылаются содержащие области) |
|
co_consts - совпадения |
набор констант, используемых в байт-коде |
|
имя совместного файла |
имя файла, в котором был создан этот объект кода |
|
co_firstлинено |
номер первой строки в исходном коде Python |
|
со_флаги |
растровое изображение флагов |
|
co_lnotab (ссылка ) |
закодированное отображение номеров строк в индексы байт-кода |
|
со_фривары |
набор имен свободных переменных (на которые ссылаются через замыкание функции) |
|
общее количество пользователей |
количество только позиционных аргументов |
|
общее количество пользователей |
количество аргументов только для ключевых слов (не включая ** arg) |
|
имя пользователя |
имя, с помощью которого был определен этот кодовый объект |
|
ко_квалификационное имя |
полное имя, с помощью которого был определен этот объект кода |
|
имена соавторов |
набор имен, отличных от аргументов и локальных функций |
|
общие локали |
количество локальных переменных |
|
co_stacksize - размер пакета |
требуется место в стеке виртуальной машины |
|
имена соавторов |
набор имен аргументов и локальных переменных |
|
генератор |
__name__ |
имя |
__квалификатор__ |
полное имя |
|
gi_фрейм |
рамка |
|
запуск gi_running |
работает ли генератор? |
|
код gi_code |
код |
|
gi_yield из |
объект, повторяемый с помощью |
|
сопрограмма |
__name__ |
имя |
__квалификатор__ |
полное имя |
|
cr_await (ожидание) |
ожидаемый объект, или |
|
cr_фрейм |
рамка |
|
запуск cr_running |
запущена ли сопрограмма? |
|
cr_код |
код |
|
cr_оригин |
где была создана сопрограмма, или |
|
встроенный |
__док__ |
строка документации |
__name__ |
оригинальное название этой функции или метода |
|
__квалификатор__ |
полное имя |
|
__self__ |
экземпляр, к которому привязан метод, или |
Изменено в версии 3.5: Добавьте атрибуты __qualname__
и gi_yieldfrom
к генераторам.
Атрибут __name__
для генераторов теперь задается из имени функции, а не из кодового имени, и теперь его можно изменять.
Изменено в версии 3.7: Добавьте атрибут cr_origin
в сопрограммы.
Изменено в версии 3.10: Добавьте атрибут __builtins__
к функциям.
- inspect.getmembers(object[, predicate])¶
Возвращает все элементы объекта в списке пар
(name, value)
, отсортированных по имени. Если указан необязательный аргумент predicate, который будет вызываться с помощью объектаvalue
для каждого элемента, то включаются только элементы, для которых предикат возвращает значение true.Примечание
getmembers()
возвращает атрибуты класса, определенные в метаклассе, только в том случае, если аргументом является класс и эти атрибуты были перечислены в пользовательском__dir__()
метаклассе.
- inspect.getmembers_static(object[, predicate])¶
Возвращает все элементы объекта в списке пар
(name, value)
, отсортированных по имени, без запуска динамического поиска по протоколу дескриптора, __getattr__ или __getattribute__. Необязательно возвращать только те элементы, которые удовлетворяют заданному предикату.Примечание
getmembers_static()
возможно, не удастся получить все элементы, которые могут быть получены get members (например, динамически создаваемые атрибуты), и могут быть найдены элементы, которые не могут быть получены getmembers (например, дескрипторы, которые вызывают AttributeError). В некоторых случаях он также может возвращать объекты-дескрипторы вместо элементов экземпляра.Добавлено в версии 3.11.
- inspect.getmodulename(path)¶
Возвращает имя модуля, указанное в файле path, без указания имен входящих в него пакетов. Расширение файла проверяется на соответствие всем записям в
importlib.machinery.all_suffixes()
. Если оно совпадает, возвращается конечный компонент path с удаленным расширением. В противном случае возвращается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.Изменено в версии 3.8: Функции, обернутые в
functools.partial()
, теперь возвращаютTrue
, если обернутая функция является функцией генератора Python.
- inspect.isgenerator(object)¶
Возвращает
True
, если объект является генератором.
- inspect.iscoroutinefunction(object)¶
Возвращает
True
, если объектом является coroutine function (функция, определенная с синтаксисомasync def
).Добавлено в версии 3.5.
Изменено в версии 3.8: Функции, заключенные в
functools.partial()
, теперь возвращаютTrue
, если заключенной функцией является coroutine function.
- inspect.iscoroutine(object)¶
Возвращает
True
, если объект является coroutine, созданным функциейasync def
.Добавлено в версии 3.5.
- inspect.isawaitable(object)¶
Возвращает
True
, если объект может быть использован в выраженииawait
.Может также использоваться для отличия сопрограмм на основе генераторов от обычных генераторов:
import types def gen(): yield @types.coroutine def gen_coro(): yield assert not isawaitable(gen()) assert isawaitable(gen_coro())
Добавлено в версии 3.5.
- inspect.isasyncgenfunction(object)¶
Возвращает
True
, если объект является функцией asynchronous generator, например:>>> async def agen(): ... yield 1 ... >>> inspect.isasyncgenfunction(agen) True
Добавлено в версии 3.6.
Изменено в версии 3.8: Функции, заключенные в
functools.partial()
, теперь возвращаютTrue
, если заключенная функция является функцией asynchronous generator.
- inspect.isasyncgen(object)¶
Возвращает
True
, если объект является asynchronous generator iterator, созданным функцией asynchronous generator.Добавлено в версии 3.6.
- inspect.istraceback(object)¶
Возвращает
True
, если объект является объектом обратной трассировки.
- inspect.isframe(object)¶
Возвращает
True
, если объект является фреймом.
- inspect.iscode(object)¶
Возвращает
True
, если объект является кодом.
- inspect.isbuiltin(object)¶
Возвращает
True
, если объект является встроенной функцией или связанным встроенным методом.
- inspect.ismethodwrapper(object)¶
Возвращает
True
, если тип объекта равенMethodWrapperType
.Это экземпляры
MethodWrapperType
, такие как__str__()
,__eq__()
и__repr__()
.Добавлено в версии 3.11.
- 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
, если объект является дескриптором данных.У дескрипторов данных есть метод
__set__
или метод__delete__
. Примерами могут служить свойства (определенные в Python), gets и члены. Последние два определены на C, и для этих типов доступны более конкретные тесты, которые являются надежными во всех реализациях Python. Как правило, дескрипторы данных также будут иметь атрибуты__name__
и__doc__
(properties, getsets и members имеют оба этих атрибута), но это не гарантируется.
- inspect.isgetsetdescriptor(object)¶
Возвращает
True
, если объект является дескриптором getset.Детали реализации CPython: gets - это атрибуты, определенные в модулях расширения с помощью структур
PyGetSetDef
. Для реализаций Python без таких типов этот метод всегда будет возвращатьFalse
.
- inspect.ismemberdescriptor(object)¶
Возвращает
True
, если объект является дескриптором-членом.Детали реализации CPython: Дескрипторы элементов - это атрибуты, определенные в модулях расширения с помощью структур
PyMemberDef
. Для реализаций Python без таких типов этот метод всегда будет возвращатьFalse
.
Получение исходного кода¶
- inspect.getdoc(object)¶
Получите строку документации для объекта, очищенную с помощью
cleandoc()
. Если строка документации для объекта не указана и объект является классом, методом, свойством или дескриптором, извлеките строку документации из иерархии наследования. ВернитеNone
, если строка документации неверна или отсутствует.Изменено в версии 3.5: Строки документации теперь наследуются, если не переопределяются.
- inspect.getcomments(object)¶
Возвращает в виде отдельной строки любые строки комментариев, непосредственно предшествующие исходному коду объекта (для класса, функции или метода) или находящиеся в верхней части исходного файла Python (если объект является модулем). Если исходный код объекта недоступен, верните
None
. Это может произойти, если объект был определен на C или в интерактивной оболочке.
- inspect.getfile(object)¶
Возвращает имя (текстового или двоичного) файла, в котором был определен объект. Это приведет к сбою с
TypeError
, если объект является встроенным модулем, классом или функцией.
- inspect.getmodule(object)¶
Попробуйте угадать, в каком модуле был определен объект. Верните
None
, если модуль не может быть определен.
- inspect.getsourcefile(object)¶
Возвращает имя исходного файла Python, в котором был определен объект, или
None
, если невозможно определить способ получения исходного кода. Это приведет к сбою сTypeError
, если объект является встроенным модулем, классом или функцией.
- inspect.getsourcelines(object)¶
Возвращает список исходных строк и номер начальной строки для объекта. Аргументом может быть модуль, класс, метод, функция, объект обратной трассировки, фрейм или код. Исходный код возвращается в виде списка строк, соответствующих объекту, а номер строки указывает, где в исходном файле была найдена первая строка кода. Значение
OSError
указывается, если исходный код не может быть получен.TypeError
вызывается, если объект является встроенным модулем, классом или функцией.
- inspect.getsource(object)¶
Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, объект обратной трассировки, фрейм или код. Исходный код возвращается в виде одной строки. Значение
OSError
указывается, если исходный код не может быть получен. ЗначениеTypeError
указывается, если объект является встроенным модулем, классом или функцией.
- inspect.cleandoc(doc)¶
Уберите отступы из строк документации, которые имеют отступы, совпадающие с блоками кода.
Из первой строки удаляются все начальные пробелы. Удаляются все начальные пробелы, которые могут быть равномерно удалены со второй строки. Пустые строки в начале и в конце впоследствии удаляются. Кроме того, все табуляции заменяются пробелами.
Самоанализ, вызываемый с помощью объекта Signature¶
Добавлено в версии 3.3.
Объект Signature
представляет сигнатуру вызова вызываемого объекта и его возвращаемую аннотацию. Чтобы получить объект Signature
, используйте функцию signature()
.
- inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)¶
Возвращает
Signature
объект для данного вызываемого объекта:>>> 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()
.Для объектов, определенных в модулях с использованием аннотаций в виде строк (
from __future__ import annotations
),signature()
будет предпринята попытка автоматической разбивки аннотаций на строки с помощьюget_annotations()
. Параметры globals, locals и eval_str передаются вget_annotations()
при разрешении аннотаций; инструкции по использованию этих параметров приведены в документации дляget_annotations()
.Вызывает
ValueError
, если подпись не может быть предоставлена, иTypeError
, если этот тип объекта не поддерживается. Кроме того, если аннотации представлены в виде строк, а значение eval_str не равно false, тоeval()
вызов(ы) для разбивки аннотаций на строки вget_annotations()
потенциально может вызвать любое исключение.Косая черта(/) в сигнатуре функции означает, что предшествующие ей параметры являются позиционными. Для получения дополнительной информации см. the FAQ entry on positional-only parameters.
Изменено в версии 3.5: Был добавлен параметр follow_wrapped. Передайте
False
, чтобы получить конкретную подпись callable (callable.__wrapped__
не будет использоваться для разворачивания оформленного вызываемого объекта).Изменено в версии 3.10: Были добавлены параметры globals, locals и eval_str.
Примечание
В некоторых реализациях Python некоторые вызываемые объекты могут быть недоступны для интроспекции. Например, в CPython некоторые встроенные функции, определенные на C, не предоставляют метаданных о своих аргументах.
Детали реализации CPython: Если переданный объект имеет атрибут
__signature__
, мы можем использовать его для создания подписи. Точная семантика является деталью реализации и может быть изменена без предварительного уведомления. Текущую семантику можно найти в исходном коде.
- class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)¶
Объект
Signature
представляет сигнатуру вызова функции и аннотацию к ее возвращаемому значению. Для каждого параметра, принимаемого функцией, она сохраняет объектParameter
в своей коллекцииparameters
.Необязательный аргумент parameters представляет собой последовательность объектов
Parameter
, которая проверяется, чтобы убедиться, что нет параметров с повторяющимися именами и что параметры расположены в правильном порядке, т.е. сначала только позиционные, затем позиционные или ключевые слова, и что параметры с значения по умолчанию соответствуют параметрам без значений по умолчанию.Необязательный аргумент return_annotation может быть произвольным объектом Python. Он представляет собой аннотацию «return» вызываемого объекта.
Signature
объекты являются неизменяемыми. ИспользуйтеSignature.replace()
для создания измененной копии.Изменено в версии 3.5:
Signature
объекты теперь доступны для выбора и hashable.- empty¶
Специальный маркер на уровне класса, указывающий на отсутствие аннотации return.
- parameters¶
Упорядоченное сопоставление имен параметров с соответствующими объектами
Parameter
. Параметры отображаются в строгом порядке определения, включая параметры, содержащие только ключевые слова.Изменено в версии 3.7: Python только явно гарантировал сохранение порядка объявления параметров, содержащих только ключевые слова, начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.
- return_annotation¶
Аннотация «return» для вызываемого объекта. Если у вызываемого объекта нет аннотации «return», этому атрибуту присваивается значение
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()
. Можно передать другие параметры и/или 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, globals=None, locals=None, eval_str=False)¶
Возвращает объект
Signature
(или его подкласс) для данного вызываемого объекта obj.Этот метод упрощает создание подкласса
Signature
:class MySignature(Signature): pass sig = MySignature.from_callable(sum) assert isinstance(sig, MySignature)
В остальном его поведение идентично поведению
signature()
.Добавлено в версии 3.5.
Изменено в версии 3.10: Были добавлены параметры globals, locals и eval_str.
- class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)¶
Parameter
объекты являются неизменяемыми. Вместо изменения объектаParameter
вы можете использоватьParameter.replace()
для создания измененной копии.Изменено в версии 3.5: Объекты параметров теперь доступны для выбора и имеют значение hashable.
- empty¶
Специальный маркер на уровне класса, указывающий на отсутствие значений по умолчанию и аннотаций.
- name¶
Имя параметра в виде строки. Имя должно быть допустимым идентификатором Python.
Детали реализации CPython: CPython генерирует неявные имена параметров вида
.0
для объектов кода, используемых для реализации понятий и генераторных выражений.Изменено в версии 3.6: Эти имена параметров теперь отображаются этим модулем как имена типа
implicit0
.
- default¶
Значение параметра по умолчанию. Если параметр не имеет значения по умолчанию, этому атрибуту присваивается значение
Parameter.empty
.
- annotation¶
Аннотация к параметру. Если параметр не содержит аннотации, этому атрибуту присваивается значение
Parameter.empty
.
- kind¶
Описывает, как значения аргументов привязываются к параметру. Возможные значения доступны через
Parameter
(например,Parameter.KEYWORD_ONLY
) и поддерживают сравнение и упорядочение в следующем порядке:Имя
Значение
ТОЛЬКО ПОЗИЦИОННЫЙ
Значение должно быть указано в качестве позиционного аргумента. Только позиционные параметры - это те, которые отображаются перед записью
/
(если она присутствует) в определении функции Python.ПОЗИЦИОННОЕ ИЛИ КЛЮЧЕВОЕ СЛОВО
Значение может быть задано либо в виде ключевого слова, либо в виде позиционного аргумента (это стандартное поведение привязки для функций, реализованных в Python).
ПЕРЕМЕННЫЙ_ПОЗИЦИОННЫЙ
Набор позиционных аргументов, которые не привязаны ни к какому другому параметру. Это соответствует параметру
*args
в определении функции Python.ТОЛЬКО КЛЮЧЕВОЕ СЛОВО_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
- kind.description¶
Описывает значение перечисления, равное
Parameter.kind
.Добавлено в версии 3.8.
Пример: выведите все описания аргументов:
>>> def foo(a, b, *, c, d=10): ... pass >>> sig = signature(foo) >>> for param in sig.parameters.values(): ... print(param.kind.description) positional or keyword positional or keyword keyword-only keyword-only
- 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¶
Изменяемое отображение имен параметров в значения аргументов. Содержит только явно связанные аргументы. Изменения в
arguments
будут отражены вargs
иkwargs
.Должен использоваться в сочетании с
Signature.parameters
для любых целей обработки аргументов.Примечание
Аргументы, для которых
Signature.bind()
илиSignature.bind_partial()
используются в качестве значений по умолчанию, пропускаются. Однако при необходимости их можно добавить с помощьюBoundArguments.apply_defaults()
.Изменено в версии 3.9:
arguments
теперь имеет типdict
. Ранее он был типаcollections.OrderedDict
.
- apply_defaults()¶
Установите значения по умолчанию для отсутствующих аргументов.
Для аргументов с переменной позицией (
*args
) по умолчанию используется пустой кортеж.Для аргументов переменной-ключевого слова (
**kwargs
) по умолчанию используется пустой dict.>>> def foo(a, b='ham', *args): pass >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments {'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.getfullargspec(func)¶
Возвращает имена и значения по умолчанию параметров функции Python. Возвращается значение named tuple:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)
args - это список имен позиционных параметров. varargs - это имя параметра
*
илиNone
, если произвольные позиционные аргументы не принимаются. varkw - это имя параметра**
илиNone
, если не принимаются произвольные аргументы ключевого слова. defaults - это n-набор значений аргументов по умолчанию, соответствующих последним n позиционным параметрам, илиNone
, если такие значения по умолчанию не определены. kwonlyargs - это список имен параметров, содержащих только ключевые слова, в порядке объявления. kwonlydefaults - это словарь, отображающий имена параметров из kwonlyargs в значения по умолчанию, используемые, если аргумент не указан. аннотации - это словарь, отображающий имена параметров в аннотации. Специальная клавиша"return"
используется для сообщения аннотации к возвращаемому функцией значению (если таковая имеется).Обратите внимание, что
signature()
и Signature Object предоставляют рекомендуемый API для вызываемого самоанализа и поддерживают дополнительные методы поведения (например, позиционные аргументы), которые иногда встречаются в API модулей расширения. Эта функция сохранена в основном для использования в коде, который должен поддерживать совместимость с API модуля Python 2inspect
.Изменено в версии 3.4: Эта функция теперь основана на
signature()
, но по-прежнему игнорирует атрибуты__wrapped__
и включает уже связанный первый параметр в выходные данные сигнатуры для связанных методов.Изменено в версии 3.6: Ранее этот метод был признан устаревшим в пользу
signature()
в Python 3.5, но это решение было отменено, чтобы восстановить четко поддерживаемый стандартный интерфейс для кода Python 2/3 с одним исходным кодом, который был перенесен с устаревшегоgetargspec()
API.Изменено в версии 3.7: Python только явно гарантировал сохранение порядка объявления параметров, содержащих только ключевые слова, начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.
- inspect.getargvalues(frame)¶
Получает информацию об аргументах, переданных в определенный фрейм. Возвращается значение A named tuple
ArgInfo(args, varargs, keywords, locals)
. args - это список имен аргументов. varargs и keywords - это имена аргументов*
и**
илиNone
. locals - это словарь locals для данного фрейма.Примечание
Эта функция была непреднамеренно помечена как устаревшая в Python 3.5.
- inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])¶
Отформатируйте спецификацию аргумента pretty из четырех значений, возвращаемых
getargvalues()
. Аргументы format* - это соответствующие необязательные функции форматирования, которые вызываются для преобразования имен и значений в строки.Примечание
Эта функция была непреднамеренно помечена как устаревшая в Python 3.5.
- inspect.getmro(cls)¶
Возвращает кортеж базовых классов class, включая cls, в порядке разрешения метода. Ни один класс не появляется в этом кортеже более одного раза. Обратите внимание, что порядок разрешения метода зависит от типа cls. Если не используется очень специфический пользовательский метатип, cls будет первым элементом кортежа.
- inspect.getcallargs(func, /, *args, **kwds)¶
Привяжите args и kwd к именам аргументов функции или метода Python func, как если бы они были вызваны с их помощью. Для связанных методов также привяжите первый аргумент (обычно с именем
self
) к соответствующему экземпляру. Возвращается dict, сопоставляющий имена аргументов (включая имена аргументов*
и**
, если таковые имеются) с их значениями из 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 их текущим значениям. Возвращается значение A named tuple
ClosureVars(nonlocals, globals, builtins, unbound)
. нелокальные сопоставляют имена, на которые ссылаются, с лексическими переменными замыкания, глобальные с глобальными параметрами модуля функции и встроенные элементы со встроенными элементами, видимыми из тела функции. несвязанный - это набор имен, на которые ссылается функция, которые вообще не могут быть разрешены с учетом текущих глобальных параметров модуля и встроенных функций.TypeError
вызывается, если func не является функцией или методом Python.Добавлено в версии 3.3.
- inspect.unwrap(func, *, stop=None)¶
Получаем объект, обернутый с помощью func. Он следует за цепочкой атрибутов
__wrapped__
, возвращающих последний объект в цепочке.stop - это необязательный обратный вызов, принимающий объект в цепочке оберток в качестве единственного аргумента, который позволяет завершить развертывание раньше, если обратный вызов возвращает значение true. Если обратный вызов не возвращает значение true, последний объект в цепочке возвращается как обычно. Например,
signature()
использует это для остановки развертывания, если для любого объекта в цепочке определен атрибут__signature__
.ValueError
вызывается при обнаружении цикла.Добавлено в версии 3.4.
- inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False)¶
Вычислите dict аннотаций для объекта.
obj
может быть вызываемым объектом, классом или модулем. При передаче объекта любого другого типа возникаетTypeError
.Возвращает dict.
get_annotations()
возвращает новый dict при каждом вызове; при его повторном вызове для одного и того же объекта будут возвращены два разных, но эквивалентных dict.Эта функция обрабатывает для вас несколько деталей:
Если
eval_str
равно true, значения типаstr
будут преобразованы вeval()
. Это предназначено для использования со строковыми аннотациями (from __future__ import annotations
).Если
obj
не содержит annotations dict, возвращает пустой dict. (Функции и методы всегда содержат annotations dict; классы, модули и другие типы вызываемых объектов могут этого не делать.)Игнорирует унаследованные аннотации к классам. Если у класса нет собственного dict-файла аннотаций, возвращает пустой dict.
Все обращения к элементам объекта и значениям dict выполняются с использованием
getattr()
иdict.get()
в целях безопасности.Всегда, всегда, всегда возвращает только что созданный dict.
eval_str
определяет, будут ли значения типаstr
заменены результатом вызоваeval()
для этих значений:Если значение eval_str равно true, то
eval()
вызывается для значений типаstr
. (Обратите внимание, чтоget_annotations
не перехватывает исключения; еслиeval()
вызывает исключение, оно разматывает стек за пределыget_annotations
звоните.)Если значение eval_str равно false (по умолчанию), значения типа
str
остаются неизменными.
globals
иlocals
передаются вeval()
; дополнительную информацию смотрите в документации поeval()
. Еслиglobals
илиlocals
равноNone
, эта функция может заменить это значение значением по умолчанию, зависящим от контекста, в зависимости отtype(obj)
:Если
obj
является модулем, то значениеglobals
по умолчанию равноobj.__dict__
.Если
obj
является классом, то дляglobals
по умолчанию используетсяsys.modules[obj.__module__].__dict__
, а дляlocals
по умолчанию используется пространство именobj
класса.Если
obj
является вызываемой функцией, тоglobals
по умолчанию имеет значениеobj.__globals__
, хотя, еслиobj
является обернутой функцией (с использованиемfunctools.update_wrapper()
), она сначала разворачивается.
Вызов
get_annotations
является наилучшей практикой для доступа к аннотациям любого объекта. Смотрите Аннотации к лучшим практикам для получения дополнительной информации о рекомендациях по аннотациям.Добавлено в версии 3.10.
Стек интерпретаторов¶
Некоторые из приведенных ниже функций возвращают объекты FrameInfo
. Для обеспечения обратной совместимости эти объекты допускают операции, подобные кортежам, со всеми атрибутами, кроме positions
. Это поведение считается устаревшим и может быть удалено в будущем.
- class inspect.FrameInfo¶
- frame¶
frame object, которому соответствует запись.
- filename¶
Имя файла, связанное с кодом, выполняемым фреймом, которому соответствует эта запись.
- lineno¶
Номер строки текущей строки, связанной с кодом, выполняемым фреймом, которому соответствует эта запись.
- function¶
Имя функции, выполняемой фреймом, которому соответствует эта запись.
- code_context¶
Список строк контекста из исходного кода, который выполняется фреймом, соответствующему этой записи.
- index¶
Индекс текущей выполняемой строки в списке
code_context
.
- positions¶
Объект
dis.Positions
, содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанные с командой, выполняемой фреймом, которому соответствует эта запись.
Изменено в версии 3.5: Верните named tuple вместо
tuple
.Изменено в версии 3.11:
FrameInfo
теперь является экземпляром класса (который обратно совместим с предыдущим named tuple).
- class inspect.Traceback¶
- filename¶
Имя файла, связанного с кодом, выполняемым фреймом, которому соответствует эта обратная трассировка.
- lineno¶
Номер строки текущей строки, связанной с кодом, выполняемым фреймом, которому соответствует эта обратная трассировка.
- function¶
Имя функции, выполняемой фреймом, которому соответствует эта обратная трассировка.
- code_context¶
Список строк контекста из исходного кода, который выполняется фреймом, соответствующему этой обратной трассировке.
- index¶
Индекс текущей выполняемой строки в списке
code_context
.
- positions¶
Объект
dis.Positions
, содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанный с командой, выполняемой фреймом, которому соответствует эта обратная трассировка.
Изменено в версии 3.11:
Traceback
теперь является экземпляром класса (который обратно совместим с предыдущим named tuple).
Примечание
Сохранение ссылок на объекты фрейма, которые содержатся в первом элементе записей фрейма, возвращаемых этими функциями, может привести к тому, что ваша программа будет создавать циклы ссылок. После создания эталонного цикла срок службы всех объектов, к которым можно получить доступ из объектов, составляющих цикл, может значительно увеличиться, даже если включен дополнительный детектор циклов в Python. Если необходимо создать такие циклы, важно убедиться, что они явно нарушены, чтобы избежать замедленного уничтожения объектов и увеличения потребления памяти, что происходит.
Хотя детектор циклов будет отслеживать их, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, удалив cycle в предложении 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
.Изменено в версии 3.11: Вместо именованного кортежа возвращается объект
Traceback
.
- inspect.getouterframes(frame, context=1)¶
Получаем список объектов
FrameInfo
для фрейма и всех внешних фреймов. Эти фреймы представляют вызовы, которые приводят к созданию frame. Первая запись в возвращаемом списке представляет frame; последняя запись представляет самый внешний вызов в стеке frame.Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.Изменено в версии 3.11: Возвращается список объектов
FrameInfo
.
- inspect.getinnerframes(traceback, context=1)¶
Получаем список объектов
FrameInfo
для фрейма обратной трассировки и всех внутренних фреймов. Эти фреймы представляют вызовы, выполненные в результате frame. Первая запись в списке представляет traceback; последняя запись указывает, где было вызвано исключение.Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.Изменено в версии 3.11: Возвращается список объектов
FrameInfo
.
- inspect.currentframe()¶
Возвращает объект frame для стекового фрейма вызывающего объекта.
Детали реализации CPython: Эта функция опирается на поддержку стековых фреймов Python в интерпретаторе, наличие которой не гарантируется во всех реализациях Python. При запуске в реализации без поддержки стековых фреймов Python эта функция возвращает
None
.
- inspect.stack(context=1)¶
Возвращает список объектов
FrameInfo
для стека вызывающей стороны. Первая запись в возвращаемом списке представляет вызывающую сторону; последняя запись представляет самый внешний вызов в стеке.Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.Изменено в версии 3.11: Возвращается список объектов
FrameInfo
.
- inspect.trace(context=1)¶
Возвращает список объектов
FrameInfo
для стека между текущим кадром и кадром, в котором было вызвано обрабатываемое в данный момент исключение. Первая запись в списке представляет вызывающий объект; последняя запись указывает, где было вызвано исключение.Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.Изменено в версии 3.11: Возвращается список объектов
FrameInfo
.
Статическая выборка атрибутов¶
И getattr()
, и hasattr()
могут инициировать выполнение кода при выборке или проверке наличия атрибутов. Будут вызываться дескрипторы, такие как свойства, и могут быть вызваны __getattr__()
и __getattribute__()
.
В случаях, когда требуется пассивный самоанализ, например, в инструментах документирования, это может быть неудобно. getattr_static()
имеет ту же сигнатуру, что и getattr()
, но позволяет избежать выполнения кода при извлечении атрибутов.
- inspect.getattr_static(obj, attr, default=None)¶
Извлекать атрибуты без запуска динамического поиска по протоколу дескриптора,
__getattr__()
или__getattribute__()
.Примечание: возможно, эта функция не сможет получить все атрибуты, которые может получить getattr (например, динамически создаваемые атрибуты), и может найти атрибуты, которые не может получить getattr (например, дескрипторы, которые вызывают AttributeError). Она также может возвращать объекты-дескрипторы вместо элементов экземпляра.
Если экземпляр
__dict__
скрыт другим элементом (например, свойством), то эта функция не сможет найти элементы экземпляра.Добавлено в версии 3.2.
getattr_static()
не разрешает дескрипторы, например, дескрипторы слотов или дескрипторы get set для объектов, реализованных на C. Вместо базового атрибута возвращается объект-дескриптор.
Вы можете обработать это с помощью кода, подобного приведенному ниже. Обратите внимание, что для произвольных дескрипторов get set их вызов может вызвать выполнение кода:
# 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: В данный момент приостановлено из-за выражения ожидания.
CORO_CLOSED: Выполнение завершено.
Добавлено в версии 3.5.
Также можно запросить текущее внутреннее состояние генератора. В основном это полезно для тестирования, чтобы убедиться, что внутреннее состояние обновляется должным образом:
- inspect.getgeneratorlocals(generator)¶
Получите отображение текущих локальных переменных в generator на их текущие значения. Возвращается словарь, который преобразует имена переменных в значения. Это эквивалентно вызову
locals()
в теле генератора, и применяются все те же предостережения.Если generator является generator без связанного в данный момент фрейма, то возвращается пустой словарь.
TypeError
вызывается, если generator не является объектом генератора Python.Детали реализации CPython: Эта функция основана на том, что генератор предоставляет фрейм стека Python для самоанализа, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда будет возвращать пустой словарь.
Добавлено в версии 3.3.
- inspect.getcoroutinelocals(coroutine)¶
Эта функция аналогична
getgeneratorlocals()
, но работает для объектов сопрограммы, созданных функциямиasync def
.Добавлено в версии 3.5.
Битовые флаги объектов кода¶
Объекты кода Python имеют атрибут co_flags
, который представляет собой растровое изображение следующих флагов:
- inspect.CO_OPTIMIZED¶
Объект кода оптимизирован с использованием быстрых локальных данных.
- inspect.CO_NEWLOCALS¶
Если задано, то при выполнении объекта кода для
f_locals
фрейма будет создан новый dict.
- inspect.CO_VARARGS¶
Объект code имеет переменный позиционный параметр (
*args
-подобный).
- inspect.CO_VARKEYWORDS¶
Объект code имеет переменный параметр ключевого слова (
**kwargs
-подобный).
- inspect.CO_NESTED¶
Флаг устанавливается, когда объект кода является вложенной функцией.
- inspect.CO_GENERATOR¶
Флаг устанавливается, когда объект кода является функцией генератора, т.е. объект генератора возвращается при выполнении объекта кода.
- inspect.CO_COROUTINE¶
Флаг устанавливается, если объект кода является функцией сопрограммы. Когда объект кода выполняется, он возвращает объект сопрограммы. Более подробную информацию смотрите в разделе PEP 492.
Добавлено в версии 3.5.
- inspect.CO_ITERABLE_COROUTINE¶
Флаг используется для преобразования генераторов в основанные на генераторах сопрограммы. Объекты-генераторы с этим флагом могут использоваться в выражении
await
и могут быть объектами сопрограммыyield from
. Более подробную информацию смотрите в разделе PEP 492.Добавлено в версии 3.5.
- inspect.CO_ASYNC_GENERATOR¶
Флаг устанавливается, когда объект кода является функцией асинхронного генератора. Когда объект кода выполняется, он возвращает объект асинхронного генератора. Более подробную информацию смотрите в разделе PEP 525.
Добавлено в версии 3.6.
Примечание
Флаги специфичны для CPython и могут не быть определены в других реализациях Python. Кроме того, флаги являются деталью реализации и могут быть удалены или признаны устаревшими в будущих версиях Python. Рекомендуется использовать общедоступные API из модуля inspect
для любых целей самоанализа.
Интерфейс командной строки¶
Модуль inspect
также предоставляет базовые возможности самоанализа из командной строки.
По умолчанию принимает имя модуля и выводит исходный код этого модуля. Вместо этого можно вывести класс или функцию в модуле, добавив двоеточие и полное имя целевого объекта.
- --details¶
Печатать информацию об указанном объекте, а не исходный код