inspect — Просмотр живых объектов
Исходный код: Lib/inspect.py
Модуль inspect предоставляет несколько полезных функций, которые помогают получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода. Например, он может помочь вам изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции или получить всю необходимую информацию для отображения подробной трассировки.
Этот модуль предоставляет четыре основных вида сервисов: проверка типов, получение исходного кода, инспектирование классов и функций, и изучение стека интерпретатора.
Типы и члены
Функция getmembers() извлекает члены объекта, такого как класс или модуль. Функции, имена которых начинаются с «is», в основном предоставляются в качестве удобных вариантов для второго аргумента функции getmembers(). Они также помогают определить, когда можно ожидать найти следующие специальные атрибуты (см. Атрибуты, связанные с импортом, для объектов модулей для атрибутов модулей):
Тип | Атрибут | Описание |
|---|---|---|
класс | __doc__ | строка документации |
__name__ | имя, с которым был определён этот класс | |
__qualname__ | полное имя | |
__module__ | имя модуля, в котором был определён этот класс | |
__type_params__ | Кортеж, содержащий параметры типа обобщённого класса | |
метод | __doc__ | строка документации |
__name__ | имя, с которым был определён этот метод | |
__qualname__ | полное имя | |
__func__ | объект функции, содержащий реализацию метода | |
__self__ | экземпляр, к которому привязан этот метод, или | |
__module__ | имя модуля, в котором был определён этот метод | |
функция | __doc__ | строка документации |
__name__ | имя, с которым была определена эта функция | |
__qualname__ | полное имя | |
__code__ | объект кода, содержащий скомпилированную функцию байткод | |
__defaults__ | кортеж любых значений по умолчанию для позиционных или ключевых параметров | |
__kwdefaults__ | отображение любых значений по умолчанию для ключевых только параметров | |
__globals__ | глобальное пространство имён, в котором была определена эта функция | |
__builtins__ | пространство имён встроенных функций | |
__annotations__ | отображение имён параметров на аннотации; | |
__type_params__ | Кортеж, содержащий параметры типа обобщённой функции | |
__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_posonlyargcount | количество позиционных аргументов только | |
co_kwonlyargcount | количество ключевых только аргументов (без учёта ** arg) | |
co_name | имя, с которым был определён этот объект кода | |
co_qualname | полное квалифицированное имя, с которым был определён этот объект кода | |
co_names | кортеж имён, отличных от аргументов и локальных переменных функции | |
co_nlocals | количество локальных переменных | |
co_stacksize | необходимое виртуальной машине пространство стека | |
co_varnames | кортеж имён аргументов и локальных переменных | |
генератор | __name__ | имя |
__qualname__ | полное имя | |
gi_frame | фрейм | |
gi_running | генератор запущен? | |
gi_code | код | |
gi_yieldfrom | объект, по которому итерируется | |
асинхронный генератор | __name__ | имя |
__qualname__ | полное имя | |
ag_await | объект, на котором происходит ожидание, или | |
ag_frame | фрейм | |
ag_running | генератор запущен? | |
ag_code | код | |
корутина | __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 для корутин.
Изменено в версии 3.10: Добавлен атрибут __builtins__ для функций.
-
inspect.getmembers(object[, predicate]) -
Возвращает все члены объекта в списке пар
(name, value)отсортированных по имени. Если предоставлен необязательный аргумент predicate — который будет вызываться с объектомvalueкаждого члена — будут включены только члены, для которых предикат возвращает значение истины.Примечание
getmembers()вернёт атрибуты класса, определённые в метаклассе, только если аргументом является класс и эти атрибуты были перечислены в пользовательском__dir__()метакласса.
-
inspect.getmembers_static(object[, predicate]) -
Возвращает все члены объекта в списке пар
(name, value)отсортированных по имени без вызова динамического поиска через протокол описателя, __getattr__ или __getattribute__. Необязательно, возвращаются только члены, удовлетворяющие заданному предикату.Примечание
getmembers_static()может не получить все члены, которые может получить getmembers (например, динамически созданные атрибуты), и может найти члены, которые getmembers не может (например, описатели, которые вызывают AttributeError). В некоторых случаях также могут возвращаться объекты описателей вместо членов экземпляра.Добавлен в версии 3.11.
-
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.Изменено в версии 3.13: Функции, обернутые в
functools.partialmethod(), теперь возвращаютTrueесли обернутая функция является функцией-генератором Python.
-
inspect.isgenerator(object) -
Возвращает
Trueесли объект является генератором.
-
inspect.iscoroutinefunction(object) -
Возвращает
Trueесли объект является функцией-генератором корутины (функция, определённая сasync defсинтаксисом), обёрткойfunctools.partial()для функции-генератора корутины или синхронной функцией, помеченнойmarkcoroutinefunction().Добавлена в версии 3.5.
Изменено в версии 3.8: Функции, обернутые в
functools.partial(), теперь возвращаютTrueесли обернутая функция является функцией-генератором корутины.Изменено в версии 3.12: Синхронные функции, помеченные
markcoroutinefunction(), теперь возвращаютTrue.Изменено в версии 3.13: Функции, обернутые в
functools.partialmethod(), теперь возвращаютTrueесли обернутая функция является функцией-генератором корутины.
-
inspect.markcoroutinefunction(func) -
Декоратор для маркировки вызываемого объекта как функции-генератора корутины, если это не будет обнаружено
iscoroutinefunction().Это может быть полезно для синхронных функций, которые возвращают корутину, если функция передаётся в API, требующему
iscoroutinefunction().В идеале следует использовать функцию с
async def. Также допустимо вызвать функцию и проверить результат с помощьюiscoroutine().Добавлена в версии 3.12.
-
inspect.iscoroutine(object) -
Возвращает
Trueесли объект является корутиной, созданной функцией с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если объект является функцией асинхронного генератора, например:>>> async def agen(): ... yield 1 ... >>> inspect.isasyncgenfunction(agen) True
Добавлена в версии 3.6.
Изменено в версии 3.8: Функции, обернутые в
functools.partial(), теперь возвращаютTrueесли обернутая функция является функцией асинхронного генератора.Изменено в версии 3.13: Функции, обернутые в
functools.partialmethod(), теперь возвращаютTrueесли обернутая функция является функцией-генератором корутины.
-
inspect.isasyncgen(object) -
Возвращает
Trueесли объект является итератором асинхронного генератора, созданным функцией асинхронного генератора.Добавлена в версии 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()истинны.Например, это верно для
int.__add__. Объект, прошедший этот тест, имеет метод__get__(), но не метод__set__()или метод__delete__(). Помимо этого, набор атрибутов варьируется. Атрибут__name__обычно имеет смысл, и__doc__часто тоже.Методы, реализованные с помощью описателей, которые также проходят один из других тестов, возвращают
Falseот тестаismethoddescriptor(), просто потому, что другие тесты обещают больше – например, вы можете рассчитывать на наличие атрибута__func__(и т.д.) при прохождении объектом тестаismethod().Изменено в версии 3.13: Эта функция больше не неправильно сообщает об объектах с
__get__()и__delete__(), но не__set__(), как о описателях методов (такие объекты являются описателями данных, а не описателями методов).
-
inspect.isdatadescriptor(object) -
Возвращает
True, если объект является описателем данных.Описатели данных имеют метод
__set__или метод__delete__. Примеры – свойства (определенные в 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(). Если строка документации для объекта не указана, а объект является классом, методом, свойством или описателем, получить строку документации из иерархии наследования. Возвращает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()могут потенциально вызвать любой вид исключения.Слэш(/) в сигнатуре функции обозначает, что параметры перед ним являются только позиционными. Более подробная информация находится в разделе FAQ о параметрах только для позиционных.
Изменено в версии 3.5: Добавлен параметр follow_wrapped. Передайте
Falseдля получения сигнатуры вызываемого объекта конкретно (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. Он представляет собой аннотацию «возврата» вызываемого объекта.
Объекты
Signatureявляются неизменяемыми. ИспользуйтеSignature.replace()илиcopy.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'"
Объекты
Signatureтакже поддерживаются универсальной функциейcopy.replace().
-
format(*, max_width=None) -
Создаёт строковое представление объекта
Signature.Если передан max_width, метод попытается поместить сигнатуру в строки с максимальной шириной max_width символов. Если сигнатура длиннее max_width, все параметры будут на отдельных строках.
Добавлен в версии 3.13.
-
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()илиcopy.replace(), чтобы создать изменённую копию.Изменено в версии 3.5: Объекты параметра теперь сериализуемы и хешируемы.
-
empty -
Специальный маркер уровня класса для обозначения отсутствия значений по умолчанию и аннотаций.
-
name -
Имя параметра в виде строки. Имя должно быть допустимым идентификатором Python.
Деталь реализации CPython: CPython генерирует неявные имена параметров вида
.0для кодовых объектов, используемых для реализации comprehensions и generator expressions.Изменено в версии 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на основе экземпляра, на котором вызывался метод. Для переопределения атрибута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'"Объекты
Parameterтакже поддерживаются универсальной функциейcopy.replace().
Изменено в версии 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.
-
args -
Кортеж значений позиционных аргументов. Динамически вычисляется из атрибута
arguments.
-
kwargs -
Словарь значений ключевых аргументов. Динамически вычисляется из атрибута
arguments. Аргументы, которые могут быть переданы позиционно, включены вargsвместо этого.
-
signature -
Ссылка на родительский объект
Signature.
-
apply_defaults() -
Устанавливает значения по умолчанию для отсутствующих аргументов.
Для аргументов с переменным числом позиционных аргументов (
*args) значение по умолчанию - пустой кортеж.Для аргументов с переменным числом ключевых аргументов (
**kwargs) значение по умолчанию - пустой словарь.>>> 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-функции. Возвращается именованный кортеж:
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.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 — необязательная функция обратного вызова, принимающая объект в цепочке обёртки в качестве единственного аргумента, которая позволяет прервать процесс разворачивания досрочно, если функция обратного вызова возвращает значение true. Если функция обратного вызова никогда не возвращает значение true, последний объект в цепочке возвращается как обычно. Например,
signature()использует это, чтобы остановить разворачивание, если какой-либо объект в цепочке имеет атрибут__signature__.ValueErrorгенерируется, если встречена циклическая зависимость.Добавлена в версии 3.4.
-
inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False) -
Вычислите словарь аннотаций для объекта.
objможет быть вызываемым объектом, классом или модулем. Передача объекта любого другого типа вызываетTypeError.Возвращает словарь.
get_annotations()возвращает новый словарь каждый раз при вызове; вызов дважды на одном и том же объекте вернёт два разных, но эквивалентных словаря.Эта функция обрабатывает несколько деталей за вас:
- Если
eval_strистинно, значения типаstrбудут дестрокизированы с помощьюeval(). Это предназначено для использования с строковыми аннотациями (from __future__ import annotations). - Если у
objнет словаря аннотаций, возвращается пустой словарь. (Функции и методы всегда имеют словарь аннотаций; классы, модули и другие типы вызываемых объектов могут его не иметь.) - Игнорирует унаследованные аннотации в классах. Если у класса нет собственного словаря аннотаций, возвращается пустой словарь.
- Все обращения к членам объекта и значениям словаря выполняются с использованием
getattr()иdict.get()для безопасности. - Всегда возвращает свежесозданный словарь.
eval_strуправляет тем, заменяются ли значения типаstrрезультатом вызоваeval()над этими значениями:- Если eval_str истинно,
eval()вызывается для значений типаstr. (Обратите внимание, чтоget_annotationsне перехватывает исключения; еслиeval()вызывает исключение, оно будет продолжать выполнение, миновав вызовget_annotations.) - Если eval_str ложно (по умолчанию), значения типа
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 -
Объект кадра, которому соответствует запись.
-
filename -
Имя файла, связанное с кодом, выполняемым кадром, которому соответствует эта запись.
-
lineno -
Номер строки текущей строки, связанной с кодом, выполняемым кадром, которому соответствует эта запись.
-
function -
Имя функции, выполняемой кадром, которому соответствует эта запись.
-
code_context -
Список строк контекста из исходного кода, который выполняется кадром, которому соответствует эта запись.
-
index -
Индекс текущей выполняемой строки в списке
code_context.
-
positions -
Объект
dis.Positions, содержащий начальный номер строки, конечный номер строки, начальный смещение столбца и конечное смещение столбца, связанные с инструкцией, выполняемой кадром, которому соответствует эта запись.
Изменено в версии 3.5: Возвращает именованный кортеж вместо
tuple.Изменено в версии 3.11:
FrameInfoтеперь является экземпляром класса (обратно совместим с предыдущим именованным кортежем). -
-
class inspect.Traceback -
-
filename -
Имя файла, связанное с кодом, выполняемым кадром, которому соответствует эта отладка.
-
lineno -
Номер строки текущей строки, связанной с кодом, выполняемым кадром, которому соответствует эта отладка.
-
function -
Имя функции, выполняемой кадром, которому соответствует эта отладка.
-
code_context -
Список строк контекста из исходного кода, который выполняется кадром, которому соответствует эта отладка.
-
index -
Индекс текущей выполняемой строки в списке
code_context.
-
positions -
Объект
dis.Positions, содержащий начальный номер строки, конечный номер строки, начальный смещение столбца и конечное смещение столбца, связанные с инструкцией, выполняемой кадром, которому соответствует эта отладка.
Изменено в версии 3.11:
Tracebackтеперь является экземпляром класса (обратно совместим с предыдущим именованным кортежем). -
Примечание
Сохранение ссылок на объекты кадров, как в первом элементе записей кадров, которые возвращают эти функции, может привести к созданию циклов ссылок в вашей программе. После создания цикла ссылок срок службы всех объектов, к которым можно получить доступ из объектов, составляющих цикл, может стать намного длиннее, даже если включён необязательный детектор циклов 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.Изменено в версии 3.11: Возвращается объект
Tracebackвместо именованного кортежа.
-
inspect.getouterframes(frame, context=1) -
Получение списка объектов
FrameInfoдля кадра и всех внешних кадров. Эти кадры представляют вызовы, которые привели к созданию frame. Первый элемент в возвращаемом списке представляет frame; последний элемент представляет самый внешний вызов в стеке frame.Изменено в версии 3.5: Возвращается список именованных кортежей
FrameInfo(frame, filename, lineno, function, code_context, index).Изменено в версии 3.11: Возвращается список объектов
FrameInfo.
-
inspect.getinnerframes(traceback, context=1) -
Получение списка объектов
FrameInfoдля кадра отладки и всех внутренних кадров. Эти кадры представляют вызовы, сделанные в результате frame. Первый элемент в списке представляет traceback; последний элемент представляет место, где произошло исключение.Изменено в версии 3.5: Возвращается список именованных кортежей
FrameInfo(frame, filename, lineno, function, code_context, index).Изменено в версии 3.11: Возвращается список объектов
FrameInfo.
-
inspect.currentframe() -
Возвращение объекта кадра для кадра стека вызывающей стороны.
Деталь реализации CPython: Эта функция полагается на поддержку кадров стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python. Если выполнение происходит в реализации без поддержки кадров стека Python, эта функция возвращает
None.
-
inspect.stack(context=1) -
Возвращение списка объектов
FrameInfoдля стека вызывающей стороны. Первый элемент в возвращаемом списке представляет вызывающую сторону; последний элемент представляет самый внешний вызов в стеке.Изменено в версии 3.5: Возвращается список именованных кортежей
FrameInfo(frame, filename, lineno, function, code_context, index).Изменено в версии 3.11: Возвращается список объектов
FrameInfo.
-
inspect.trace(context=1) -
Возвращает список объектов
FrameInfoдля стека между текущей рамкой и рамкой, в которой в настоящее время обрабатывается исключение. Первый элемент в списке представляет вызывающую функцию; последний элемент представляет место, где было возбуждено исключение.Изменено в версии 3.5: Возвращается список именованных кортежей
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() не разрешает дескрипторы, например, слотовые дескрипторы или дескрипторы 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.getasyncgenstate(agen) -
Получить текущее состояние объекта асинхронного генератора. Функция предназначена для использования с объектами асинхронных итераторов, созданными функциями
async def, которые используют операторyield, но будет принимать любой объект, подобный асинхронному генератору, который имеет атрибутыag_runningиag_frame.Возможные состояния:
- AGEN_CREATED: Ожидание начала выполнения.
- AGEN_RUNNING: В настоящее время выполняется интерпретатором.
- AGEN_SUSPENDED: В настоящее время приостановлен в выражении yield.
- AGEN_CLOSED: Выполнение завершено.
Добавлена в версии 3.12.
Текущее внутреннее состояние генератора также можно запросить. Это в основном полезно для тестирования, чтобы убедиться, что внутреннее состояние обновляется как ожидается:
-
inspect.getgeneratorlocals(generator) -
Получение отображения активных локальных переменных в генераторе и их текущих значений. Возвращается словарь, сопоставляющий имена переменных со значениями. Это эквивалентно вызову
locals()в теле генератора, и все те же оговорки применяются.Если генератор — это генератор без связанной в данный момент рамки, возвращается пустой словарь. Если генератор не является объектом Python-генератора, генерируется
TypeError.Деталь реализации CPython: Эта функция полагается на то, что генератор предоставляет фрейм стека Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда вернёт пустой словарь.
Добавлена в версии 3.3.
-
inspect.getcoroutinelocals(coroutine) -
Эта функция аналогична
getgeneratorlocals(), но работает для объектов корутин, созданных функциямиasync def.Добавлена в версии 3.5.
-
inspect.getasyncgenlocals(agen) -
Эта функция аналогична
getgeneratorlocals(), но работает для объектов асинхронных генераторов, созданных функциямиasync def, которые используют операторyield.Добавлена в версии 3.12.
Флаги битовых полей объектов кода
Объекты кода 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_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 для всех потребностей интроспекции.
Флаги буфера
-
class inspect.BufferFlags -
Это
enum.IntFlag, представляющий флаги, которые могут быть переданы методу__buffer__()объектов, реализующих протокол буфера.Значение флагов объяснено в Типах запросов буфера.
-
SIMPLE
-
WRITABLE
-
FORMAT
-
ND
-
STRIDES
-
C_CONTIGUOUS
-
F_CONTIGUOUS
-
ANY_CONTIGUOUS
-
INDIRECT
-
CONTIG
-
CONTIG_RO
-
STRIDED
-
STRIDED_RO
-
RECORDS
-
RECORDS_RO
-
FULL
-
FULL_RO
-
READ
-
WRITE
Добавлен в версии 3.12.
-
Интерфейс командной строки
Модуль inspect также предоставляет базовые возможности интроспекции из командной строки.
По умолчанию принимает имя модуля и выводит исходный код этого модуля. Класс или функция внутри модуля могут быть выведены вместо этого, добавив двоеточие и полное имя целевого объекта.
-
--details -
Вывести информацию о указанном объекте, а не исходный код
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/inspect.html