inspect
— Осмотрите живые объекты¶
Исходный код: Lib/inspect.py.
Модуль inspect
предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, с его помощью можно изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю информацию, необходимую для отображения подробной обратной трассировки.
Существует четыре основных вида услуг, предоставляемых этим модулем: проверка типов, получение исходного кода, проверка классов и функций и проверка стека интерпретатора.
Типы и члены¶
Функция getmembers()
извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобного выбора второго аргумента для getmembers()
. Они также помогут вам определить, когда вы можете ожидать найти следующие специальные атрибуты:
Тип |
Атрибут |
Описание |
---|---|---|
модуль |
__doc__ |
строка документации |
__file__ |
имя файла (отсутствует для встроенных модулей) |
|
класс |
__doc__ |
строка документации |
__name__ |
имя, под которым был определен этот класс |
|
__qualname__ |
квалифицированное имя |
|
__модуль__ |
имя модуля, в котором был определен этот класс |
|
метод |
__doc__ |
строка документации |
__name__ |
имя, под которым был определен данный метод |
|
__qualname__ |
квалифицированное имя |
|
__func__ |
объект функции, содержащий реализацию метода |
|
__self__ |
экземпляр, к которому привязан данный метод, или |
|
__модуль__ |
имя модуля, в котором был определен данный метод |
|
функция |
__doc__ |
строка документации |
__name__ |
имя, под которым была определена данная функция |
|
__qualname__ |
квалифицированное имя |
|
__код__ |
объект кода, содержащий скомпилированную функцию bytecode |
|
__defaults__. |
кортеж любых значений по умолчанию для позиционных или ключевых параметров |
|
__kwdefaults__ |
отображение любых значений по умолчанию для параметров, содержащих только ключевые слова |
|
__globals__ |
глобальное пространство имен, в котором была определена эта функция |
|
__builtins__ |
пространство имен builtins |
|
__аннотации__. |
отображение имен параметров на аннотации; ключ |
|
__модуль__ |
имя модуля, в котором была определена данная функция |
|
traceback |
tb_frame |
каркасный объект на этом уровне |
tb_lasti |
индекс последней попытки выполнения инструкции в байткоде |
|
tb_lineno |
номер текущей строки в исходном коде Python |
|
tb_next |
следующий внутренний объект трассировки (вызываемый этим уровнем) |
|
рама |
f_back |
следующий объект внешнего кадра (вызывающий этот кадр) |
f_builtins |
пространство имен builtins, видимое этим кадром |
|
f_code |
объект кода, выполняемый в данном кадре |
|
f_globals |
глобальное пространство имен, видимое этим кадром |
|
f_lasti |
индекс последней попытки выполнения инструкции в байткоде |
|
f_lineno |
номер текущей строки в исходном коде Python |
|
f_локалы |
локальное пространство имен, видимое этим кадром |
|
f_trace |
функция трассировки для этого кадра, или |
|
код |
co_argcount |
количество аргументов (не включая аргументы, содержащие только ключевые слова, * или ** аргументы) |
co_code |
строка необработанного скомпилированного байткода |
|
co_cellvars |
кортеж имен переменных ячеек (на которые ссылаются содержащие диапазоны) |
|
co_consts |
кортеж констант, используемых в байткоде |
|
co_filename |
имя файла, в котором был создан данный объект кода |
|
co_firstlineno |
номер первой строки в исходном коде Python |
|
co_flags |
битовая карта флагов |
|
co_lnotab |
кодированное отображение номеров строк на индексы байткода |
|
co_freevars |
кортеж имен свободных переменных (на которые ссылаются через закрытие функции) |
|
co_posonlyargcount |
количество только позиционных аргументов |
|
co_kwonlyargcount |
количество аргументов только для ключевого слова (не включая ** arg) |
|
совместное имя |
имя, под которым был определен данный объект кода |
|
совместные имена |
кортеж имен, отличных от аргументов и локалей функции |
|
co_nlocals |
количество локальных переменных |
|
co_stacksize |
необходимое пространство стека виртуальной машины |
|
co_varnames |
кортеж имен аргументов и локальных переменных |
|
генератор |
__name__ |
имя |
__qualname__ |
квалифицированное имя |
|
gi_frame |
рама |
|
gi_running |
работает ли генератор? |
|
gi_code |
код |
|
gi_yieldfrom |
объект, итерируемый по |
|
coroutine |
__name__ |
имя |
__qualname__ |
квалифицированное имя |
|
cr_await |
ожидаемый объект, или |
|
cr_frame |
рама |
|
cr_running |
выполняется ли корутина? |
|
cr_code |
код |
|
cr_origin |
где была создана coroutine, или |
|
встроенный |
__doc__ |
строка документации |
__name__ |
исходное имя этой функции или метода |
|
__qualname__ |
квалифицированное имя |
|
__self__ |
экземпляр, к которому привязан метод, или |
Изменено в версии 3.5: Добавьте атрибуты __qualname__
и gi_yieldfrom
к генераторам.
Атрибут __name__
генераторов теперь устанавливается из имени функции, а не из имени кода, и его теперь можно изменять.
Изменено в версии 3.7: Добавьте атрибут cr_origin
к coroutines.
Изменено в версии 3.10: Добавьте атрибут __builtins__
к функциям.
-
inspect.
getmembers
(object[, predicate])¶ Возвращает все члены объекта в виде списка пар
(name, value)
, отсортированных по имени. Если указан необязательный аргумент predicate, который будет вызван с объектомvalue
каждого члена, то в список включаются только те члены, для которых предикат возвращает истинное значение.Примечание
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.Изменено в версии 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
.Также может использоваться для отличия генераторных корутинов от обычных генераторов:
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.
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
, если объект является дескриптором данных.Дескрипторы данных имеют метод
__set__
или__delete__
. Примерами являются свойства (определенные в Python), гетсеты и члены. Последние два типа определены в C, и для них существуют более специфические тесты, которые являются надежными для всех реализаций Python. Обычно дескрипторы данных также имеют атрибуты__name__
и__doc__
(свойства, геты и члены имеют оба этих атрибута), но это не гарантировано.
-
inspect.
isgetsetdescriptor
(object)¶ Возвращает
True
, если объект является дескриптором getset.CPython implementation detail: getsets - это атрибуты, определенные в модулях расширения через структуры
PyGetSetDef
. Для реализаций Python, не имеющих таких типов, этот метод всегда будет возвращатьFalse
.
-
inspect.
ismemberdescriptor
(object)¶ Возвращает
True
, если объект является дескриптором члена.CPython implementation detail: Дескрипторы членов - это атрибуты, определяемые в модулях расширения через структуры
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
.
-
inspect.
getsource
(object)¶ Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, трассировка, фрейм или объект кода. Исходный код возвращается в виде одной строки. Если исходный код не может быть получен, выдается сообщение
OSError
.
-
inspect.
cleandoc
(doc)¶ Очистите отступы в документах, которые отступают для выравнивания с блоками кода.
Из первой строки удаляются все ведущие пробельные символы. Со второй строки и далее удаляются все пробельные символы, которые могут быть равномерно удалены. Пустые строки в начале и конце впоследствии удаляются. Кроме того, все табуляции расширяются до пробелов.
Интроспекция вызываемых файлов с помощью объекта Signature¶
Добавлено в версии 3.3.
Объект Signature представляет сигнатуру вызова вызываемого объекта и его возвращаемую аннотацию. Чтобы получить объект Signature, используйте функцию signature()
.
-
inspect.
signature
(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)¶ Возвращает объект
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()
.Для объектов, определенных в модулях, использующих строковые аннотации (
from __future__ import annotations
),signature()
попытается автоматически разгруппировать аннотации с помощьюinspect.get_annotations()
. Параметрыglobal
,locals
иeval_str
передаются вinspect.get_annotations()
при разрешении аннотаций; инструкции по использованию этих параметров см. в документации кinspect.get_annotations()
.Вызывает
ValueError
, если подпись не может быть предоставлена, иTypeError
, если данный тип объекта не поддерживается. Кроме того, если аннотации структурированы, иeval_str
не является false, то вызовeval()
для удаления строк из аннотаций потенциально может вызвать исключение любого типа.Косая черта(/) в сигнатуре функции означает, что параметры перед ней являются только позиционными. Для получения дополнительной информации смотрите the FAQ entry on positional-only parameters.
Добавлено в версии 3.5:
follow_wrapped
параметр. ПередайтеFalse
, чтобы получить сигнатуру конкретноcallable
(callable.__wrapped__
не будет использоваться для разворачивания декорированных вызываемых таблиц).Добавлено в версии 3.10:
globals
,locals
иeval_str
параметры.Примечание
В некоторых реализациях Python некоторые вызываемые функции могут не быть интроспективными. Например, в CPython некоторые встроенные функции, определенные на языке C, не содержат метаданных о своих аргументах.
-
class
inspect.
Signature
(parameters=None, *, return_annotation=Signature.empty)¶ Объект Signature представляет сигнатуру вызова функции и ее возвращаемую аннотацию. Для каждого параметра, принимаемого функцией, он хранит объект
Parameter
в своей коллекцииparameters
.Необязательный аргумент parameters представляет собой последовательность объектов
Parameter
, которая проверяется на отсутствие параметров с дублирующимися именами, а также на то, что параметры расположены в правильном порядке, т.е. сначала только позиционные, затем позиционные или ключевые слова, и что параметры с значениями по умолчанию следуют за параметрами без значений по умолчанию.Необязательный аргумент return_annotation, который может быть произвольным объектом Python, является аннотацией «return» вызываемого объекта.
Объекты сигнатур являются неизменяемыми. Используйте
Signature.replace()
для создания измененной копии.Изменено в версии 3.5: Объекты подписи являются picklable и hashable.
-
empty
¶ Специальный маркер уровня класса для указания отсутствия аннотации возврата.
-
parameters
¶ Упорядоченное отображение имен параметров на соответствующие объекты
Parameter
. Параметры отображаются в строгом порядке определения, включая параметры, не содержащие ключевого слова.Изменено в версии 3.7: Python явно гарантировал сохранение порядка объявления параметров, содержащих только ключевые слова, только в версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.
-
return_annotation
¶ Аннотация «возврата» для вызываемой программы. Если вызываемый объект не имеет аннотации «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. Можно передавать различные
parameters
и/илиreturn_annotation
, чтобы переопределить соответствующие свойства базовой сигнатуры. Чтобы удалить return_annotation из скопированной сигнатуры, передайтеSignature.empty
.>>> def test(a, b): ... pass >>> sig = signature(test) >>> new_sig = sig.replace(return_annotation="new return anno") >>> str(new_sig) "(a, b) -> 'new return anno'"
-
classmethod
from_callable
(obj, *, follow_wrapped=True, globalns=None, localns=None)¶ Возвращает объект
Signature
(или его подкласс) для заданного вызываемогоobj
. Передайтеfollow_wrapped=False
, чтобы получить сигнатуруobj
без разворачивания его цепочки__wrapped__
.globalns
иlocalns
будут использоваться в качестве пространств имен при разрешении аннотаций.Этот метод упрощает подклассификацию
Signature
:class MySignature(Signature): pass sig = MySignature.from_callable(min) assert isinstance(sig, MySignature)
Добавлено в версии 3.5.
Добавлено в версии 3.10:
globalns
иlocalns
параметры.
-
-
class
inspect.
Parameter
(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)¶ Объекты Parameter являются неизменяемыми. Вместо модификации объекта Parameter можно использовать
Parameter.replace()
для создания модифицированной копии.Изменено в версии 3.5: Объекты параметров являются picklable и hashable.
-
empty
¶ Специальный маркер уровня класса для указания отсутствия значений по умолчанию и аннотаций.
-
name
¶ Имя параметра в виде строки. Имя должно быть действительным идентификатором Python.
CPython implementation detail: 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
-
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 на основе экземпляра, для которого была вызвана функция replaced. Чтобы переопределить атрибут
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)¶ Расположите заданный список классов в иерархию вложенных списков. Если появляется вложенный список, то он содержит классы, производные от класса, запись которого непосредственно предшествует списку. Каждая запись представляет собой кортеж, содержащий класс и кортеж его базовых классов. Если аргумент 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()
и Signature Object, которые предоставляют более структурированный API интроспекции для вызываемых таблиц.
-
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 на значения по умолчанию, используемые в случае отсутствия аргументов. annotations - это словарь, отображающий имена параметров на аннотации. Специальный ключ"return"
используется для сообщения аннотации возвращаемого значения функции (если таковая имеется).Обратите внимание, что
signature()
и Signature Object предоставляют рекомендуемый 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)¶ Получение информации об аргументах, переданных в определенный фрейм. Возвращается named tuple
ArgInfo(args, varargs, keywords, locals)
. args - это список имен аргументов. varargs и keywords - это имена аргументов*
и**
илиNone
. locals - словарь locals данного фрейма.Примечание
Эта функция по ошибке была помечена как устаревшая в Python 3.5.
-
inspect.
formatargspec
(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]])¶ Форматирование красивого аргумента spec из значений, возвращаемых командой
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 Object, которые обеспечивают лучший API интроспекции для вызываемых таблиц.
-
inspect.
formatargvalues
(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])¶ Форматирует красивый аргумент spec из четырех значений, возвращаемых командой
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 на их текущие значения. Возвращается named tuple
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.
-
inspect.
get_annotations
(obj, *, globals=None, locals=None, eval_str=False)¶ Вычислите дикту аннотаций для объекта.
obj
может быть вызываемым объектом, классом или модулем. При передаче объекта любого другого типа возникает ошибкаTypeError
.Возвращает дикту.
get_annotations()
возвращает новый dict при каждом вызове; если вызвать его дважды на одном и том же объекте, он вернет два разных, но эквивалентных dict.Эта функция обрабатывает несколько деталей за вас:
Если
eval_str
равно true, то значения типаstr
будут нестрого структурированы с помощьюeval()
. Это предназначено для использования со строковыми аннотациями (from __future__ import annotations
).Если
obj
не имеет диктата аннотаций, возвращает пустой дикт. (Функции и методы всегда имеют дикту аннотаций; классы, модули и другие типы вызываемых объектов могут не иметь).Игнорирует унаследованные аннотации классов. Если класс не имеет собственного 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.
Стек интерпретатора¶
Когда следующие функции возвращают «записи кадров», каждая запись представляет собой кортеж named tuple 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)¶ Получение информации о фрейме или объекте трассировки. Возвращается named tuple
Traceback(filename, lineno, function, code_context, index)
.
-
inspect.
getouterframes
(frame, context=1)¶ Получить список записей кадров для кадра и всех внешних кадров. Эти кадры представляют вызовы, которые привели к созданию кадра. Первая запись в возвращаемом списке представляет фрейм; последняя запись представляет крайний вызов в стеке фрейма.
Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.
-
inspect.
getinnerframes
(traceback, context=1)¶ Получить список записей кадров для кадра трассировки и всех внутренних кадров. Эти кадры представляют вызовы, сделанные как следствие кадра. Первая запись в списке представляет traceback; последняя запись представляет место, где было вызвано исключение.
Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.
-
inspect.
currentframe
()¶ Возвращает объект фрейма для фрейма стека вызывающей стороны.
CPython implementation detail: Эта функция полагается на поддержку стековой рамки Python в интерпретаторе, которая гарантированно существует не во всех реализациях Python. При выполнении в реализации без поддержки стековой рамки Python эта функция возвращает
None
.
-
inspect.
stack
(context=1)¶ Возвращает список записей кадров для стека вызывающей стороны. Первая запись в возвращаемом списке представляет вызывающую сторону; последняя запись представляет крайний вызов в стеке.
Изменено в версии 3.5: Возвращается список named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)
.
-
inspect.
trace
(context=1)¶ Возвращает список записей кадров для стека между текущим кадром и кадром, в котором было вызвано обрабатываемое в данный момент исключение. Первая запись в списке представляет вызывающую сторону; последняя запись представляет место, где было вызвано исключение.
Изменено в версии 3.5: Возвращается список named tuples
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: В настоящее время приостановлено на выражении доходности.
GEN_CLOSED: Выполнение завершено.
Добавлено в версии 3.2.
-
inspect.
getcoroutinestate
(coroutine)¶ Получить текущее состояние объекта coroutine. Функция предназначена для использования с объектами coroutine, созданными функциями
async def
, но может принимать любой coroutine-подобный объект, имеющий атрибутыcr_running
иcr_frame
.- Возможными состояниями являются:
CORO_CREATED: Ожидание начала выполнения.
CORO_RUNNING: В настоящее время выполняется интерпретатором.
CORO_SUSPENDED: В настоящее время приостановлено на выражении await.
CORO_CLOSED: Выполнение завершено.
Добавлено в версии 3.5.
Можно также запросить текущее внутреннее состояние генератора. В основном это полезно для тестирования, чтобы убедиться, что внутреннее состояние обновляется так, как ожидается:
-
inspect.
getgeneratorlocals
(generator)¶ Получить отображение живых локальных переменных в generator на их текущие значения. Возвращается словарь, в котором имена переменных сопоставлены со значениями. Это эквивалентно вызову
locals()
в теле генератора, и действуют те же предостережения.Если generator является generator без связанного в данный момент фрейма, то возвращается пустой словарь. Если generator не является объектом генератора Python, возникает ошибка
TypeError
.CPython implementation detail: Эта функция полагается на то, что генератор раскрывает стековый кадр Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда будет возвращать пустой словарь.
Добавлено в версии 3.3.
-
inspect.
getcoroutinelocals
(coroutine)¶ Эта функция аналогична
getgeneratorlocals()
, но работает для объектов coroutine, созданных функциямиasync def
.Добавлено в версии 3.5.
Объекты кода Битовые флаги¶
Объекты кода Python имеют атрибут co_flags
, который представляет собой битовую карту следующих флагов:
-
inspect.
CO_OPTIMIZED
¶ Кодовый объект оптимизирован, в нем используются быстрые локали.
-
inspect.
CO_NEWLOCALS
¶ Если установлено, то при выполнении объекта кода для фрейма
f_locals
будет создан новый dict.
-
inspect.
CO_VARARGS
¶ Объект кода имеет переменный позиционный параметр (
*args
-подобный).
-
inspect.
CO_VARKEYWORDS
¶ Объект кода имеет переменный параметр ключевого слова (
**kwargs
-подобный).
-
inspect.
CO_NESTED
¶ Флаг устанавливается, если объект кода является вложенной функцией.
-
inspect.
CO_GENERATOR
¶ Флаг устанавливается, если объект кода является функцией-генератором, т.е. при выполнении объекта кода возвращается объект-генератор.
-
inspect.
CO_NOFREE
¶ Флаг устанавливается, если нет свободных или клеточных переменных.
-
inspect.
CO_COROUTINE
¶ Флаг устанавливается, если объект кода является корутинной функцией. Когда объект кода выполняется, он возвращает объект 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
¶
Печать информации об указанном объекте вместо исходного кода