Документация Python неофициальный перевод

inspect.md

1162 строк · 100.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/library/inspect.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `inspect` – Инспекция живых объектов89**Исходный код:** [Lib/inspect.py](https://python-all.ru/src/main/Lib/inspect.py)1011---1213Модуль `inspect` предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты кадров и объекты кода. Например, он позволяет изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов функции или получить всю информацию, необходимую для вывода подробной трассировки.1415Этот модуль предоставляет четыре основных вида сервисов: проверка типов, получение исходного кода, инспекция классов и функций, а также анализ стека интерпретатора.1617## Типы и члены1819Функция [`getmembers()`](https://python-all.ru/3.16/library/inspect.html#inspect.getmembers) получает члены объекта, например класса или модуля. Функции, имена которых начинаются с «is», в основном предоставляются как удобный выбор для второго аргумента `getmembers()`. Они также помогают определить, когда можно ожидать следующие специальные атрибуты (см. [Атрибуты, связанные с импортом, у объектов модулей](https://python-all.ru/3.16/reference/datamodel.html#import-mod-attrs) для атрибутов модуля):2021| Тип | Атрибут | Описание |22| --- | --- | --- |23| класс | doc | строка документации |24|  | name | имя, под которым был определён этот класс |25|  | qualname | полное имя |26|  | module | имя модуля, в котором был определён этот класс |27|  | type\_params | Кортеж, содержащий [параметры типа](https://python-all.ru/3.16/reference/compound_stmts.html#type-params) обобщённого класса |28| метод | doc | строка документации |29|  | name | имя, под которым был определён этот метод |30|  | qualname | полное имя |31|  | func | объект функции, содержащий реализацию метода |32|  | self | экземпляр, к которому привязан этот метод, или `None` |33|  | module | имя модуля, в котором был определён этот метод |34| функция | doc | строка документации |35|  | name | имя, под которым была определена эта функция |36|  | qualname | полное имя |37|  | code | объект кода, содержащий скомпилированную функцию [байткод](https://python-all.ru/3.16/glossary.html#term-bytecode) |38|  | defaults | кортеж значений по умолчанию для позиционных или именованных параметров |39|  | kwdefaults | отображение значений по умолчанию для параметров, доступных только по ключевым словам |40|  | globals | глобальное пространство имён, в котором была определена эта функция |41|  | builtins | пространство имён builtins |42|  | annotations | отображение имён параметров в аннотации; ключ `"return"` зарезервирован для аннотаций возвращаемого значения. |43|  | type\_params | Кортеж, содержащий [параметры типа](https://python-all.ru/3.16/reference/compound_stmts.html#type-params) обобщённой функции |44|  | module | имя модуля, в котором была определена эта функция |45| traceback | tb\_frame | объект фрейма на этом уровне |46|  | tb\_lasti | индекс последней предпринятой инструкции в байткоде |47|  | tb\_lineno | текущий номер строки в исходном коде Python |48|  | tb\_next | следующий внутренний объект traceback (вызванный на этом уровне) |49| фрейм | f\_back | следующий внешний объект фрейма (вызывающий этот фрейм) |50|  | f\_builtins | пространство имён builtins, видимое этим фреймом |51|  | f\_code | объект кода, выполняющийся в этом фрейме |52|  | f\_globals | глобальное пространство имён, видимое этим фреймом |53|  | f\_lasti | индекс последней предпринятой инструкции в байткоде |54|  | f\_lineno | текущий номер строки в исходном коде Python |55|  | f\_locals | локальное пространство имён, видимое этим фреймом |56|  | f\_generator | возвращает объект генератора или корутины, которому принадлежит этот фрейм, или `None`, если фрейм принадлежит обычной функции |57|  | f\_trace | функция трассировки для этого фрейма или `None` |58|  | f\_trace\_lines | указывает, вызывается ли событие трассировки для каждой строки исходного кода |59|  | f\_trace\_opcodes | указывает, запрашиваются ли события для каждой операции |60|  | clear() | используется для очистки всех ссылок на локальные переменные |61| код | co\_argcount | количество аргументов (не включая только именованные аргументы, \* или \*\* args) |62|  | co\_code | строка сырого скомпилированного байткода |63|  | co\_cellvars | кортеж имён клеточных переменных (используемых в объёмлющих областях видимости) |64|  | co\_consts | кортеж констант, используемых в байткоде |65|  | co\_filename | имя файла, в котором был создан этот объект кода |66|  | co\_firstlineno | номер первой строки в исходном коде Python |67|  | co\_flags | битовая маска флагов `CO_*`, подробнее [здесь](https://python-all.ru/3.16/library/inspect.html#inspect-module-co-flags) |68|  | co\_freevars | кортеж имён свободных переменных (на которые есть ссылка через замыкание функции) |69|  | co\_posonlyargcount | количество позиционных аргументов |70|  | co\_kwonlyargcount | количество только ключевых аргументов (не включая \*\* arg) |71|  | co\_name | имя, с которым был определён этот объект кода |72|  | co\_qualname | полное квалифицированное имя, с которым был определён этот объект кода |73|  | co\_names | кортеж имён, отличных от аргументов и локальных переменных функции |74|  | co\_nlocals | количество локальных переменных |75|  | co\_stacksize | требуемый размер стека виртуальной машины |76|  | co\_varnames | кортеж имён аргументов и локальных переменных |77|  | co\_lines() | возвращает итератор, который порождает последовательные диапазоны байт-кода |78|  | co\_positions() | возвращает итератор позиций исходного кода для каждой инструкции байт-кода |79|  | replace() | возвращает копию объекта кода с новыми значениями |80| генератор | name | имя |81|  | qualname | полное имя |82|  | gi\_frame | фрейм |83|  | gi\_running | выполняется ли генератор? |84|  | gi\_suspended | приостановлен ли генератор? |85|  | gi\_code | код |86|  | gi\_yieldfrom | объект, итерируемый `yield from`, или `None` |87|  | gi\_state | состояние генератора, одно из `GEN_CREATED`, `GEN_RUNNING`, `GEN_SUSPENDED` или `GEN_CLOSED` |88| асинхронный генератор | name | имя |89|  | qualname | полное имя |90|  | ag\_await | ожидаемый объект, или `None` |91|  | ag\_frame | фрейм |92|  | ag\_running | выполняется ли генератор? |93|  | ag\_suspended | приостановлен ли генератор? |94|  | ag\_code | код |95|  | ag\_state | состояние асинхронного генератора, одно из `AGEN_CREATED`, `AGEN_RUNNING`, `AGEN_SUSPENDED` или `AGEN_CLOSED` |96| корутина | name | имя |97|  | qualname | полное имя |98|  | cr\_await | ожидаемый объект, или `None` |99|  | cr\_frame | фрейм |100|  | cr\_running | выполняется ли корутина? |101|  | cr\_suspended | приостановлена ли корутина? |102|  | cr\_code | код |103|  | cr\_origin | где была создана корутина, или `None`. См. [`sys.set_coroutine_origin_tracking_depth()`](https://python-all.ru/3.16/library/sys.html#sys.set_coroutine_origin_tracking_depth) |104|  | cr\_state | состояние корутины, одно из `CORO_CREATED`, `CORO_RUNNING`, `CORO_SUSPENDED` или `CORO_CLOSED` |105| встроенный | doc | строка документации |106|  | name | исходное имя этой функции или метода |107|  | qualname | полное имя |108|  | self | экземпляр, к которому привязан метод, или `None` |109110Изменено в версии 3.5: Добавлены атрибуты `__qualname__` и `gi_yieldfrom` для генераторов.111112Атрибут `__name__` генераторов теперь устанавливается из имени функции, а не из имени кода, и его можно изменять.113114Изменено в версии 3.7: Добавлен атрибут `cr_origin` для корутин.115116Изменено в версии 3.10: Добавлен атрибут `__builtins__` для функций.117118Изменено в версии 3.11: Добавлен атрибут `gi_suspended` для генераторов.119120Изменено в версии 3.11: Добавлен атрибут `cr_suspended` для корутин.121122Изменено в версии 3.12: Добавлен атрибут `ag_suspended` для асинхронных генераторов.123124Изменено в версии 3.14: Добавлен атрибут `f_generator` для фреймов.125126Изменено в версии 3.15:Добавлены атрибуты `gi_state` для генераторов, `cr_state` для корутин и `ag_state` для асинхронных генераторов.127128#### `inspect.getmembers(object[, predicate])`129130Возвращает все члены объекта в виде списка пар `(name, value)`, отсортированных по имени. Если передан необязательный аргумент *predicate* – который будет вызван с объектом `value` каждого члена, – включаются только те члены, для которых предикат возвращает истинное значение.131132> **Примечание**133>134> `getmembers()` возвращает только атрибуты класса, определённые в метаклассе, когда аргумент является классом, и эти атрибуты были перечислены в пользовательском [`__dir__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__dir__) метакласса.135136#### `inspect.getmembers_static(object[, predicate])`137138Возвращает все члены объекта в виде списка пар `(name, value)`, отсортированных по имени, без запуска динамического поиска через протокол дескриптора, \_\_getattr\_\_ или \_\_getattribute\_\_. При необходимости возвращает только те члены, которые удовлетворяют заданному предикату.139140> **Примечание**141>142> `getmembers_static()` может не смочь получить все члены, которые может получить getmembers (например, динамически созданные атрибуты), и может найти члены, которые getmembers не может (например, дескрипторы, вызывающие AttributeError). В некоторых случаях она также может возвращать объекты дескрипторов вместо членов экземпляра.143144Добавлено в версии 3.12.145146#### `inspect.getmodulename(path)`147148Возвращает имя модуля, заданного файлом *path*, без включения имён объемлющих пакетов. Расширение файла проверяется по всем записям в [`importlib.machinery.all_suffixes()`](https://python-all.ru/3.16/library/importlib.html#importlib.machinery.all_suffixes). Если совпадение найдено, возвращается последний компонент пути с удалённым расширением. В противном случае возвращается `None`.149150Обратите внимание, что эта функция *только* возвращает осмысленное имя для реальных модулей Python – пути, которые потенциально относятся к пакетам Python, всё равно вернут `None`.151152Изменено в версии 3.3: Функция теперь основана непосредственно на [`importlib`](https://python-all.ru/3.16/library/importlib.html#module-importlib).153154#### `inspect.ismodule(object)`155156Возвращает `True`, если объект является модулем.157158#### `inspect.isclass(object)`159160Возвращает `True`, если объект является классом, встроенным или созданным в коде Python.161162Эта функция возвращает `False` для [обобщённых псевдонимов](https://python-all.ru/3.16/library/stdtypes.html#types-genericalias) классов, таких как `list[int]`.163164#### `inspect.ismethod(object)`165166Возвращает `True`, если объект – связанный метод, написанный на Python.167168> **Примечание**169>170> Например, для такого класса:171>172> ```python173> >>> class Greeter:174> ...     def say_hello(self):175> ...         print('hello!')176> ```177>178> Связанный метод (также известный как *метод экземпляра*) создаётся при обращении к `say_hello` ([функции](https://python-all.ru/3.16/glossary.html#term-function), определённой в пространстве имён `Greeter`) через экземпляр класса `Greeter`:179>180> ```python181> >>> instance = Greeter()182>183> >>> instance.say_hello184> <bound method Greeter.say_hello of <__main__.Greeter object ...>>185> >>> ismethod(instance.say_hello)186> True187> >>> isfunction(instance.say_hello)188> False189> ```190>191> Обращение к `say_hello` через класс `Greeter` вернёт саму функцию. Для этой функции `ismethod()` вернёт `False`, но [`isfunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.isfunction) вернёт `True`:192>193> ```python194> >>> Greeter.say_hello195> <function Greeter.say_hello at 0x7f7503854a90>196> >>> ismethod(Greeter.say_hello)197> False198> >>> isfunction(Greeter.say_hello)199> True200> ```201>202> Подробнее см. в [Методы](https://python-all.ru/3.16/library/stdtypes.html#typesmethods).203204#### `inspect.isfunction(object)`205206Возвращает `True`, если объект является функцией Python, включая функции, созданные с помощью [lambda](https://python-all.ru/3.16/glossary.html#term-lambda)-выражения.207208Пример см. в примечании к [`ismethod()`](https://python-all.ru/3.16/library/inspect.html#inspect.ismethod).209210#### `inspect.ispackage(object)`211212Возвращает `True`, если объект является [пакетом](https://python-all.ru/3.16/glossary.html#term-package).213214Добавлено в версии 3.14.215216#### `inspect.isgeneratorfunction(object)`217218Возвращает `True`, если объект является функцией-генератором Python.219220Она также возвращает `True` для связанных методов, созданных из функций-генераторов Python (подробнее см. в [Методы](https://python-all.ru/3.16/library/stdtypes.html#typesmethods)).221222Изменено в версии 3.8: Функции, обёрнутые в [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial), теперь возвращают `True`, если обёрнутая функция является функцией-генератором Python.223224Изменено в версии 3.13: Функции, обёрнутые в [`functools.partialmethod()`](https://python-all.ru/3.16/library/functools.html#functools.partialmethod), теперь возвращают `True`, если обёрнутая функция является функцией-генератором Python.225226#### `inspect.isgenerator(object)`227228Возвращает `True`, если объект является генератором.229230#### `inspect.iscoroutinefunction(object)`231232Возвращает `True`, если объект является [корутинной функцией](https://python-all.ru/3.16/glossary.html#term-coroutine-function) (функция, определённая с синтаксисом [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def)), [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial), обёртывающей корутинную функцию, или синхронной функцией, помеченной [`markcoroutinefunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.markcoroutinefunction).233234Добавлено в версии 3.5.235236Изменено в версии 3.8: Функции, обёрнутые в [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial), теперь возвращают `True`, если обёрнутая функция является [корутинной функцией](https://python-all.ru/3.16/glossary.html#term-coroutine-function).237238Изменено в версии 3.12: Синхронные функции, помеченные [`markcoroutinefunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.markcoroutinefunction), теперь возвращают `True`.239240Изменено в версии 3.13: Функции, обёрнутые в [`functools.partialmethod()`](https://python-all.ru/3.16/library/functools.html#functools.partialmethod), теперь возвращают `True`, если обёрнутая функция является [корутинной функцией](https://python-all.ru/3.16/glossary.html#term-coroutine-function).241242#### `inspect.markcoroutinefunction(func)`243244Декоратор для пометки вызываемого объекта как [корутинной функции](https://python-all.ru/3.16/glossary.html#term-coroutine-function), если он не будет обнаружен [`iscoroutinefunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.iscoroutinefunction) иным образом.245246Это может быть полезно для синхронных функций, которые возвращают [корутину](https://python-all.ru/3.16/glossary.html#term-coroutine), если функция передаётся в API, требующий [`iscoroutinefunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.iscoroutinefunction).247248Если возможно, предпочтительнее использовать [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def) функцию. Также допустимо вызвать функцию и проверить возвращаемое значение с помощью [`iscoroutine()`](https://python-all.ru/3.16/library/inspect.html#inspect.iscoroutine).249250Добавлено в версии 3.12.251252#### `inspect.iscoroutine(object)`253254Возвращает `True`, если объект является [корутиной](https://python-all.ru/3.16/glossary.html#term-coroutine), созданной функцией [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def).255256Добавлено в версии 3.5.257258#### `inspect.isawaitable(object)`259260Возвращает `True`, если объект может использоваться в выражении [`await`](https://python-all.ru/3.16/reference/expressions.html#await).261262Также может использоваться для отличия корутин на основе генераторов от обычных генераторов:263264```python265import types266267def gen():268    yield269@types.coroutine270def gen_coro():271    yield272273assert not isawaitable(gen())274assert isawaitable(gen_coro())275```276277Добавлено в версии 3.5.278279#### `inspect.isasyncgenfunction(object)`280281Возвращает `True`, если объект является функцией [асинхронного генератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-generator), например:282283```pycon284>>> async def agen():285...     yield 1286...287>>> inspect.isasyncgenfunction(agen)288True289```290291Добавлено в версии 3.6.292293Изменено в версии 3.8: Функции, обёрнутые в [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial), теперь возвращают `True`, если обёрнутая функция является функцией [асинхронного генератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-generator).294295Изменено в версии 3.13: Функции, обёрнутые в [`functools.partialmethod()`](https://python-all.ru/3.16/library/functools.html#functools.partialmethod), теперь возвращают `True`, если обёрнутая функция является функцией [асинхронного генератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-generator).296297#### `inspect.isasyncgen(object)`298299Возвращает `True`, если объект является [итератором асинхронного генератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-generator-iterator), созданным функцией [асинхронного генератора](https://python-all.ru/3.16/glossary.html#term-asynchronous-generator).300301Добавлено в версии 3.6.302303#### `inspect.istraceback(object)`304305Возвращает `True`, если объект является traceback.306307#### `inspect.isframe(object)`308309Возвращает `True`, если объект является фреймом.310311#### `inspect.iscode(object)`312313Возвращает `True`, если объект является кодом.314315#### `inspect.isbuiltin(object)`316317Возвращает `True`, если объект является встроенной функцией или связанным встроенным методом.318319#### `inspect.ismethodwrapper(object)`320321Возвращает `True`, если тип объекта – это [`MethodWrapperType`](https://python-all.ru/3.16/library/types.html#types.MethodWrapperType).322323Это экземпляры [`MethodWrapperType`](https://python-all.ru/3.16/library/types.html#types.MethodWrapperType), такие как [`__str__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__str__), [`__eq__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__eq__) и [`__repr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__repr__).324325Добавлено в версии 3.12.326327#### `inspect.isroutine(object)`328329Возвращает `True`, если объект является пользовательской или встроенной функцией или методом.330331#### `inspect.isabstract(object)`332333Возвращает `True`, если объект является абстрактным базовым классом.334335#### `inspect.ismethoddescriptor(object)`336337Возвращает `True`, если объект является дескриптором метода, но не если [`ismethod()`](https://python-all.ru/3.16/library/inspect.html#inspect.ismethod), [`isclass()`](https://python-all.ru/3.16/library/inspect.html#inspect.isclass), [`isfunction()`](https://python-all.ru/3.16/library/inspect.html#inspect.isfunction) или [`isbuiltin()`](https://python-all.ru/3.16/library/inspect.html#inspect.isbuiltin) истинны.338339Это верно, например, для `int.__add__`. Объект, проходящий эту проверку, имеет метод [`__get__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__get__), но не имеет метода [`__set__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__set__) или метода [`__delete__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__delete__). Помимо этого, набор атрибутов различается. Атрибут [`__name__`](https://python-all.ru/3.16/library/stdtypes.html#definition.__name__) обычно имеет смысл, и [`__doc__`](https://python-all.ru/3.16/library/stdtypes.html#definition.__doc__) часто тоже.340341Методы, реализованные через дескрипторы и также проходящие одну из других проверок, возвращают `False` из проверки `ismethoddescriptor()`, просто потому что другие проверки обещают больше – например, можно рассчитывать на наличие атрибута [`__func__`](https://python-all.ru/3.16/reference/datamodel.html#method.__func__) (и т.д.), когда объект проходит [`ismethod()`](https://python-all.ru/3.16/library/inspect.html#inspect.ismethod).342343Изменено в версии 3.13: Эта функция больше не ошибочно сообщает об объектах с [`__get__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__get__) и [`__delete__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__delete__), но без [`__set__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__set__), как о дескрипторах метода (такие объекты являются дескрипторами данных, а не дескрипторами метода).344345#### `inspect.isdatadescriptor(object)`346347Возвращает `True`, если объект является дескриптором данных.348349Дескрипторы данных имеют метод [`__set__`](https://python-all.ru/3.16/reference/datamodel.html#object.__set__) или [`__delete__`](https://python-all.ru/3.16/reference/datamodel.html#object.__delete__). Примеры: свойства (определённые в Python), getsets и members. Последние два определены в C, и для этих типов существуют более специфичные проверки, которые надёжны в разных реализациях Python. Обычно дескрипторы данных также имеют атрибуты [`__name__`](https://python-all.ru/3.16/library/stdtypes.html#definition.__name__) и `__doc__` (свойства, getsets и members имеют оба этих атрибута), но это не гарантируется.350351#### `inspect.isgetsetdescriptor(object)`352353Возвращает `True`, если объект является дескриптором getset.354355**Особенность реализации CPython:** getsets – это атрибуты, определённые в модулях расширения через структуры [`PyGetSetDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyGetSetDef). Для реализаций Python без таких типов этот метод всегда будет возвращать `False`.356357#### `inspect.ismemberdescriptor(object)`358359Возвращает `True`, если объект является дескриптором члена.360361**Особенности реализации CPython:** Дескрипторы членов – это атрибуты, определённые в модулях расширения через структуры [`PyMemberDef`](https://python-all.ru/3.16/c-api/structures.html#c.PyMemberDef). В реализациях Python без таких типов этот метод всегда возвращает `False`.362363## Получение исходного кода364365#### `inspect.getdoc(object, *, inherit_class_doc=True, fallback_to_class_doc=True)`366367Возвращает строку документации для объекта, очищенную с помощью [`cleandoc()`](https://python-all.ru/3.16/library/inspect.html#inspect.cleandoc). Если строка документации для объекта не указана:368369- если объект – класс и *inherit\_class\_doc* равно True (по умолчанию), строка документации извлекается из иерархии наследования;370- если объект – метод, свойство или дескриптор, строка документации извлекается из иерархии наследования;371- в противном случае, если *fallback\_to\_class\_doc* равно True (по умолчанию), строка документации извлекается из класса объекта.372373Возвращает `None`, если строка документации отсутствует или некорректна.374375Изменено в версии 3.5: Теперь строки документации наследуются, если не переопределены.376377Изменено в версии 3.15: Добавлены параметры *inherit\_class\_doc* и *fallback\_to\_class\_doc*.378379Строки документации для объектов [`cached_property`](https://python-all.ru/3.16/library/functools.html#functools.cached_property) теперь наследуются, если не переопределены.380381#### `inspect.getcomments(object)`382383Возвращает в виде одной строки все строки комментариев, непосредственно предшествующие исходному коду объекта (для класса, функции или метода), либо в начале Python-файла (если объект – модуль). Если исходный код объекта недоступен, возвращает `None`. Это может произойти, если объект определён на C или в интерактивной оболочке.384385#### `inspect.getfile(object)`386387Возвращает имя (текстового или бинарного) файла, в котором определён объект. Вызывает исключение [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если объект – встроенный модуль, класс или функция.388389#### `inspect.getmodule(object)`390391Пытается определить модуль, в котором определён объект. Возвращает `None`, если модуль не удаётся определить.392393#### `inspect.getsourcefile(object)`394395Возвращает имя Python-файла с исходным кодом, в котором определён объект, или `None`, если способ получить исходный код не найден. Вызывает исключение [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если объект – встроенный модуль, класс или функция.396397#### `inspect.getsourcelines(object)`398399Возвращает список строк исходного кода и номер начальной строки для объекта. Аргументом может быть модуль, класс, метод, функция, traceback, frame или code-объект. Исходный код возвращается в виде списка строк этого объекта, а номер строки указывает положение первой строки кода в исходном файле. Вызывается исключение [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError), если исходный код не удаётся получить. Вызывается [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если объект – встроенный модуль, класс или функция.400401Изменено в версии 3.3: [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) вызывается вместо [`IOError`](https://python-all.ru/3.16/library/exceptions.html#IOError), который теперь является его псевдонимом.402403#### `inspect.getsource(object)`404405Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, traceback, frame или code-объект. Исходный код возвращается в виде одной строки. Вызывается [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError), если исходный код не удаётся получить. Вызывается [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если объект – встроенный модуль, класс или функция.406407Изменено в версии 3.3: [`OSError`](https://python-all.ru/3.16/library/exceptions.html#OSError) вызывается вместо [`IOError`](https://python-all.ru/3.16/library/exceptions.html#IOError), который теперь является его псевдонимом.408409#### `inspect.cleandoc(doc)`410411Убирает отступы из docstrings, которые выровнены с блоками кода.412413Из первой строки удаляются все начальные пробелы. Все начальные пробелы, которые можно равномерно удалить со второй строки и далее, также удаляются. Пустые строки в начале и конце удаляются. Кроме того, все табуляции заменяются пробелами.414415## Интроспекция вызываемых объектов с помощью объекта Signature416417Добавлено в версии 3.3.418419Объект [`Signature`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature) представляет сигнатуру вызова вызываемого объекта и аннотацию его возвращаемого значения. Для получения объекта `Signature` используйте функцию `signature()`.420421#### `inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)`422423Возвращает объект [`Signature`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature) для заданного *callable*:424425```pycon426>>> from inspect import signature427>>> def foo(a, *, b:int, **kwargs):428...     pass429430>>> sig = signature(foo)431432>>> str(sig)433'(a, *, b: int, **kwargs)'434435>>> str(sig.parameters['b'])436'b: int'437438>>> sig.parameters['b'].annotation439<class 'int'>440```441442Принимает широкий спектр вызываемых объектов Python: от обычных функций и классов до объектов [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial).443444Если некоторые аннотации представлены строками (например, из-за использования `from __future__ import annotations`), `signature()` попытается автоматически преобразовать их из строк в обычные аннотации с помощью [`annotationlib.get_annotations()`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.get_annotations). Параметры *globals*, *locals* и *eval\_str* передаются в `annotationlib.get_annotations()` при разрешении аннотаций; см. документацию по `annotationlib.get_annotations()` для получения инструкций по использованию этих параметров. Элемент перечисления [`annotationlib.Format`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.Format) можно передать в параметр *annotation\_format* для управления форматом возвращаемых аннотаций. Например, используйте `annotation_format=annotationlib.Format.STRING` для возврата аннотаций в строковом формате.445446Вызывает [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError), если сигнатуру невозможно предоставить, и [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если такой тип объекта не поддерживается. Кроме того, если аннотации преобразованы в строки и *eval\_str* не равен false, вызов(ы) `eval()` для обратного преобразования аннотаций в [`annotationlib.get_annotations()`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.get_annotations) могут потенциально вызвать исключения любого типа.447448Слеш (/) в сигнатуре функции означает, что параметры до него являются только позиционными. Подробнее см. [вопрос FAQ о только позиционных параметрах](https://python-all.ru/3.16/faq/programming.html#faq-positional-only-arguments).449450Изменено в версии 3.5: Был добавлен параметр *follow\_wrapped*. Передайте `False`, чтобы получить сигнатуру именно *вызываемого объекта* (`callable.__wrapped__` не будет использоваться для раскрытия декорированных вызываемых объектов.)451452Изменено в версии 3.10: Были добавлены параметры *globals*, *locals* и *eval\_str*.453454Изменено в версии 3.14: Был добавлен параметр *annotation\_format*.455456> **Примечание**457>458> Некоторые вызываемые объекты могут быть недоступны для интроспекции в определённых реализациях Python. Например, в CPython некоторые встроенные функции, определённые на C, не предоставляют метаданных о своих аргументах.459460**Особенности реализации CPython:** Если у переданного объекта есть атрибут `__signature__`, он может использоваться для создания сигнатуры. Точная семантика является деталью реализации и может быть изменена без предварительного уведомления. Обратитесь к исходному коду за актуальной семантикой.461462#### `class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)`463464Объект `Signature` представляет сигнатуру вызова функции и её аннотацию возврата. Для каждого параметра, принимаемого функцией, он хранит объект [`Parameter`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter) в своей коллекции [`parameters`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.parameters).465466Необязательный аргумент *parameters* – это последовательность объектов [`Parameter`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter), которая проверяется на отсутствие дублирующихся имён параметров и на правильный порядок: сначала только позиционные, затем позиционно-ключевые, а параметры со значениями по умолчанию следуют за параметрами без них.467468Необязательный аргумент *return\_annotation* может быть произвольным объектом Python. Он представляет аннотацию «return» вызываемого объекта.469470Объекты `Signature` являются *неизменяемыми*. Используйте [`Signature.replace()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.replace) или [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace), чтобы создать изменённую копию.471472Изменено в версии 3.5: Объекты `Signature` теперь являются сериализуемыми и [хешируемыми](https://python-all.ru/3.16/glossary.html#term-hashable).473474#### `empty`475476Специальный маркер уровня класса для указания отсутствия аннотации возврата.477478#### `parameters`479480Упорядоченное отображение имён параметров в соответствующие объекты [`Parameter`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter). Параметры располагаются в строгом порядке определения, включая только ключевые параметры.481482Изменено в версии 3.7: Python явно гарантирует сохранение порядка объявления только-ключевых параметров начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.483484#### `return_annotation`485486Аннотация «return» вызываемого объекта. Если у вызываемого объекта нет аннотации «return», этот атрибут устанавливается в [`Signature.empty`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.empty).487488#### `bind(*args, **kwargs)`489490Создаёт отображение позиционных и ключевых аргументов в параметры. Возвращает [`BoundArguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments), если `*args` и `**kwargs` соответствуют сигнатуре, или вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError).491492#### `bind_partial(*args, **kwargs)`493494Работает так же, как [`Signature.bind()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind), но позволяет опускать некоторые обязательные аргументы (имитирует поведение [`functools.partial()`](https://python-all.ru/3.16/library/functools.html#functools.partial)). Возвращает [`BoundArguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments) или вызывает [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError), если переданные аргументы не соответствуют сигнатуре.495496#### `replace(*[, parameters][, return_annotation])`497498Создаёт новый экземпляр `Signature` на основе экземпляра, для которого был вызван `replace()`. Можно передать другие значения *parameters* и/или *return\_annotation*, чтобы переопределить соответствующие свойства исходной сигнатуры. Чтобы удалить `return_annotation` из скопированной `Signature`, передайте [`Signature.empty`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.empty).499500```pycon501>>> def test(a, b):502...     pass503...504>>> sig = signature(test)505>>> new_sig = sig.replace(return_annotation="new return anno")506>>> str(new_sig)507"(a, b) -> 'new return anno'"508```509510Объекты `Signature` также поддерживаются универсальной функцией [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace).511512#### `format(*, max_width=None, quote_annotation_strings=True)`513514Создаёт строковое представление объекта `Signature`.515516Если передан *max\_width*, метод попытается уместить сигнатуру в строки длиной не более *max\_width* символов. Если сигнатура длиннее *max\_width*, все параметры будут размещены на отдельных строках.517518Если *quote\_annotation\_strings* имеет значение False, [аннотации](https://python-all.ru/3.16/glossary.html#term-annotation) в сигнатуре отображаются без открывающих и закрывающих кавычек, если они являются строками. Это полезно, если сигнатура была создана в формате [`STRING`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.Format.STRING) или если использовался `from __future__ import annotations`.519520Добавлено в версии 3.13.521522Изменено в версии 3.14: Был добавлен параметр *unquote\_annotations*.523524#### `classmethod from_callable(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)`525526Возвращает объект `Signature` (или его подкласс) для заданного вызываемого объекта *obj*.527528Этот метод упрощает создание подклассов `Signature`:529530```python531class MySignature(Signature):532    pass533sig = MySignature.from_callable(sum)534assert isinstance(sig, MySignature)535```536537В остальном его поведение идентично [`signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature).538539Добавлено в версии 3.5.540541Изменено в версии 3.10: Были добавлены параметры *globals*, *locals* и *eval\_str*.542543#### `class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)`544545Объекты `Parameter` являются *неизменяемыми*. Вместо изменения объекта `Parameter` можно использовать [`Parameter.replace()`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter.replace) или [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace) для создания изменённой копии.546547Изменено в версии 3.5: Объекты Parameter теперь сериализуемы и [хешируемы](https://python-all.ru/3.16/glossary.html#term-hashable).548549#### `empty`550551Специальный маркер уровня класса для указания отсутствия значений по умолчанию и аннотаций.552553#### `name`554555Имя параметра в виде строки. Имя должно быть допустимым идентификатором Python.556557**Особенности реализации CPython:** CPython генерирует неявные имена параметров вида `.0` в объектах кода, используемых для реализации включений (comprehensions) и выражений-генераторов.558559Изменено в версии 3.6: Теперь этот модуль предоставляет эти имена параметров как имена вида `implicit0`.560561#### `default`562563Значение параметра по умолчанию. Если у параметра нет значения по умолчанию, этот атрибут устанавливается в [`Parameter.empty`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter.empty).564565#### `annotation`566567Аннотация параметра. Если у параметра нет аннотации, этот атрибут устанавливается в [`Parameter.empty`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter.empty).568569#### `kind`570571Описывает, как значения аргументов привязываются к параметру. Возможные значения доступны через `Parameter` (например, `Parameter.KEYWORD_ONLY`), и поддерживают сравнение и упорядочивание в следующем порядке:572573| Имя | Значение |574| --- | --- |575| *POSITIONAL\_ONLY* | Значение должно передаваться как позиционный аргумент. Параметры только для позиционной передачи – это те, которые находятся перед записью `/` (если она присутствует) в определении функции Python. |576| *POSITIONAL\_OR\_KEYWORD* | Значение может передаваться как ключевой, так и позиционный аргумент (это стандартное поведение привязки для функций, реализованных на Python). |577| *VAR\_POSITIONAL* | Кортеж позиционных аргументов, которые не привязаны ни к одному другому параметру. Это соответствует параметру `*args` в определении функции Python. |578| *KEYWORD\_ONLY* | Значение должно передаваться как ключевой аргумент. Параметры только для ключевой передачи – это те, которые находятся после записи `*` или `*args` в определении функции Python. |579| *VAR\_KEYWORD* | Словарь ключевых аргументов, которые не привязаны ни к одному другому параметру. Это соответствует параметру `**kwargs` в определении функции Python. |580581Пример: вывод всех аргументов только для ключевой передачи без значений по умолчанию:582583```pycon584>>> def foo(a, b, *, c, d=10):585...     pass586587>>> sig = signature(foo)588>>> for param in sig.parameters.values():589...     if (param.kind == param.KEYWORD_ONLY and590...                        param.default is param.empty):591...         print('Parameter:', param)592Parameter: c593```594595#### `kind.description`596597Описывает значение перечисления [`Parameter.kind`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter.kind).598599Добавлено в версии 3.8.600601Пример: вывод всех описаний аргументов:602603```pycon604>>> def foo(a, b, *, c, d=10):605...     pass606607>>> sig = signature(foo)608>>> for param in sig.parameters.values():609...     print(param.kind.description)610positional or keyword611positional or keyword612keyword-only613keyword-only614```615616#### `replace(*[, name][, kind][, default][, annotation])`617618Создаёт новый экземпляр `Parameter` на основе экземпляра, на котором была вызвана операция замены. Чтобы переопределить атрибут `Parameter`, передайте соответствующий аргумент. Чтобы удалить значение по умолчанию и/или аннотацию из `Parameter`, передайте [`Parameter.empty`](https://python-all.ru/3.16/library/inspect.html#inspect.Parameter.empty).619620```pycon621>>> from inspect import Parameter622>>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)623>>> str(param)624'foo=42'625626>>> str(param.replace()) # Создаст поверхностную копию 'param'627'foo=42'628629>>> str(param.replace(default=Parameter.empty, annotation='spam'))630"foo: 'spam'"631```632633Объекты `Parameter` также поддерживаются универсальной функцией [`copy.replace()`](https://python-all.ru/3.16/library/copy.html#copy.replace).634635Изменено в версии 3.4: В Python 3.3 объектам `Parameter` разрешалось иметь `name`, установленное в `None`, если их `kind` было установлено в `POSITIONAL_ONLY`. Это больше не допускается.636637#### `class inspect.BoundArguments`638639Результат вызова [`Signature.bind()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind) или [`Signature.bind_partial()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind_partial). Содержит отображение аргументов на параметры функции.640641#### `arguments`642643Изменяемое отображение имён параметров на значения аргументов. Содержит только явно привязанные аргументы. Изменения в [`arguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.arguments) отразятся в [`args`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.args) и [`kwargs`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.kwargs).644645Следует использовать совместно с [`Signature.parameters`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.parameters) для любых целей обработки аргументов.646647> **Примечание**648>649> Аргументы, для которых [`Signature.bind()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind) или [`Signature.bind_partial()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind_partial) полагались на значение по умолчанию, пропускаются. Однако при необходимости используйте [`BoundArguments.apply_defaults()`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.apply_defaults), чтобы добавить их.650651Изменено в версии 3.9: [`arguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.arguments) теперь имеет тип [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict). Ранее он имел тип [`collections.OrderedDict`](https://python-all.ru/3.16/library/collections.html#collections.OrderedDict).652653#### `args`654655Кортеж значений позиционных аргументов. Динамически вычисляется из атрибута [`arguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.arguments).656657#### `kwargs`658659Словарь значений именованных аргументов. Динамически вычисляется из атрибута [`arguments`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.arguments). Аргументы, которые можно передать позиционно, включаются в [`args`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.args) вместо этого.660661#### `signature`662663Ссылка на родительский объект [`Signature`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature).664665#### `apply_defaults()`666667Устанавливает значения по умолчанию для отсутствующих аргументов.668669Для переменных позиционных аргументов (`*args`) значением по умолчанию является пустой кортеж.670671Для переменных именованных аргументов (`**kwargs`) значением по умолчанию является пустой словарь.672673```pycon674>>> def foo(a, b='ham', *args): pass675>>> ba = inspect.signature(foo).bind('spam')676>>> ba.apply_defaults()677>>> ba.arguments678{'a': 'spam', 'b': 'ham', 'args': ()}679```680681Добавлено в версии 3.5.682683Свойства [`args`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.args) и [`kwargs`](https://python-all.ru/3.16/library/inspect.html#inspect.BoundArguments.kwargs) можно использовать для вызова функций:684685```python686def test(a, *, b):687    ...688689sig = signature(test)690ba = sig.bind(10, b=20)691test(*ba.args, **ba.kwargs)692```693694> **См. также**695>696> **[**PEP 362**](https://python-all.ru/3.16/library/inspect.html) – объект сигнатуры функции.**697>698> Подробная спецификация, детали реализации и примеры.699700## Классы и функции701702#### `inspect.getclasstree(classes, unique=False)`703704Упорядочивает заданный список классов в иерархию вложенных списков. Если встречается вложенный список, он содержит классы, унаследованные от класса, запись которого непосредственно предшествует этому списку. Каждая запись представляет собой кортеж из двух элементов, содержащий класс и кортеж его базовых классов. Если аргумент *unique* равен true, в возвращаемой структуре появляется ровно одна запись для каждого класса из заданного списка. В противном случае классы, использующие множественное наследование, и их потомки будут появляться несколько раз.705706#### `inspect.getfullargspec(func, *, annotation_format=Format.VALUE)`707708Возвращает имена и значения по умолчанию параметров функции Python. Возвращается [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple):709710`FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)`711712*args* – это список имён позиционных параметров. *varargs* – это имя параметра `*` или `None`, если произвольные позиционные аргументы не принимаются. *varkw* – это имя параметра `**` или `None`, если произвольные именованные аргументы не принимаются. *defaults* – это *n*-кортеж значений аргументов по умолчанию, соответствующих последним *n* позиционным параметрам, или `None`, если такие значения по умолчанию не определены. *kwonlyargs* – это список имён только именованных параметров в порядке объявления. *kwonlydefaults* – это словарь, сопоставляющий имена параметров из *kwonlyargs* со значениями по умолчанию, используемыми, если аргумент не передан. *annotations* – это словарь, сопоставляющий имена параметров с аннотациями. Специальный ключ `"return"` используется для указания аннотации возвращаемого значения функции (если есть).713714Обратите внимание, что [`signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature) и [объект Signature](https://python-all.ru/3.16/library/inspect.html#inspect-signature-object) предоставляют рекомендуемый API для интроспекции вызываемых объектов и поддерживают дополнительное поведение (например, позиционные аргументы), которое иногда встречается в API модулей расширения. Эта функция сохранена в основном для использования в коде, которому необходима совместимость с API модуля Python 2 `inspect`.715716Элемент перечисления [`annotationlib.Format`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.Format) можно передать параметру *annotation\_format*, чтобы управлять форматом возвращаемых аннотаций. Например, используйте `annotation_format=annotationlib.Format.STRING`, чтобы возвращать аннотации в строковом формате. Обратите внимание: при использовании формата по умолчанию `VALUE` создание некоторых описаний аргументов может вызывать исключение.717718Изменено в версии 3.4: Эта функция теперь основана на [`signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature), но по-прежнему игнорирует атрибуты `__wrapped__` и включает уже привязанный первый параметр в вывод сигнатуры для связанных методов.719720Изменено в версии 3.6: Ранее этот метод был объявлен устаревшим в пользу [`signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature) в Python 3.5, но это решение было отменено, чтобы восстановить чётко поддерживаемый стандартный интерфейс для кода на Python 2/3 из одного источника, который мигрирует от устаревшего API `getargspec()`.721722Изменено в версии 3.7: Python явно гарантирует сохранение порядка объявления только-ключевых параметров начиная с версии 3.7, хотя на практике этот порядок всегда сохранялся в Python 3.723724Изменено в версии 3.15: Добавлен параметр *annotation\_format*.725726#### `inspect.getargvalues(frame)`727728Извлекает информацию об аргументах, переданных в заданный фрейм. Возвращается [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple) `ArgInfo(args, varargs, keywords, locals)`. *args* – список имён аргументов. *varargs* и *keywords* – имена аргументов `*` и `**` или `None`. *locals* – это словарь локальных переменных данного фрейма.729730> **Примечание**731>732> Эта функция была ошибочно помечена как устаревшая в Python 3.5.733734#### `inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])`735736Форматирует красивое описание аргументов из четырёх значений, возвращаемых [`getargvalues()`](https://python-all.ru/3.16/library/inspect.html#inspect.getargvalues). Аргументы format\* – это соответствующие опциональные функции форматирования, которые вызываются для преобразования имён и значений в строки.737738> **Примечание**739>740> Эта функция была ошибочно помечена как устаревшая в Python 3.5.741742#### `inspect.getmro(cls)`743744Возвращает кортеж базовых классов класса cls, включая cls, в порядке разрешения методов (MRO). Ни один класс не встречается в этом кортеже более одного раза. Обратите внимание, что порядок разрешения методов зависит от типа cls. Если не используется особенная пользовательская метатипизация, cls будет первым элементом кортежа.745746#### `inspect.getcallargs(func, /, *args, **kwds)`747748Связывает *args* и *kwds* с именами аргументов функции или метода Python *func*, как если бы она была вызвана с ними. Для связанных методов (bound methods) также связывает первый аргумент (обычно названный `self`) с соответствующим экземпляром. Возвращается словарь, отображающий имена аргументов (включая имена аргументов `*` и `**`, если они есть) на их значения из *args* и *kwds*. В случае неправильного вызова *func*, т.е. когда `func(*args, **kwds)` возбудило бы исключение из-за несовместимой сигнатуры, возбуждается исключение того же типа и с тем же или похожим сообщением. Например:749750```pycon751>>> from inspect import getcallargs752>>> def f(a, b=1, *pos, **named):753...     pass754...755>>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}756True757>>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}758True759>>> getcallargs(f)760Traceback (most recent call last):761...762TypeError: f() missing 1 required positional argument: 'a'763```764765Добавлено в версии 3.2.766767Устарело с версии 3.5: Используйте [`Signature.bind()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind) и [`Signature.bind_partial()`](https://python-all.ru/3.16/library/inspect.html#inspect.Signature.bind_partial) вместо этого.768769#### `inspect.getclosurevars(func)`770771Извлекает отображение ссылок на внешние имена в функции или методе Python *func* на их текущие значения. Возвращается [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple) `ClosureVars(nonlocals, globals, builtins, unbound)`. *nonlocals* отображает ссылочные имена на переменные лексического замыкания, *globals* – на глобальные переменные модуля функции, а *builtins* – на встроенные имена, видимые из тела функции. *unbound* – множество имён, на которые есть ссылки в функции, но которые не удалось разрешить при текущих глобальных переменных модуля и встроенных именах.772773[`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError) возбуждается, если *func* не является функцией или методом Python.774775Добавлено в версии 3.3.776777#### `inspect.unwrap(func, *, stop=None)`778779Получает объект, обёрнутый в *func*. Следует по цепочке атрибутов `__wrapped__`, возвращая последний объект в цепочке.780781*stop* – опциональный колбэк, принимающий объект в цепочке обёрток в качестве единственного аргумента, который позволяет досрочно завершить разворачивание, если колбэк возвращает истинное значение. Если колбэк никогда не возвращает истинное значение, возвращается последний объект в цепочке как обычно. Например, [`signature()`](https://python-all.ru/3.16/library/inspect.html#inspect.signature) использует это, чтобы остановить разворачивание, если какой-либо объект в цепочке имеет определённый атрибут `__signature__`.782783[`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError) возбуждается, если обнаружен цикл.784785Добавлено в версии 3.4.786787#### `inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)`788789Вычисляет словарь аннотаций для объекта.790791Это псевдоним для [`annotationlib.get_annotations()`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.get_annotations); обратитесь к документации этой функции за дополнительной информацией.792793> **Внимание**794>795> Эта функция может выполнять произвольный код, содержащийся в аннотациях. См. [Последствия безопасности интроспекции аннотаций](https://python-all.ru/3.16/library/annotationlib.html#annotationlib-security) для получения дополнительной информации.796797Добавлено в версии 3.10.798799Изменено в версии 3.14: Эта функция теперь является псевдонимом для [`annotationlib.get_annotations()`](https://python-all.ru/3.16/library/annotationlib.html#annotationlib.get_annotations). Вызов её как `inspect.get_annotations` продолжит работать.800801## Стек интерпретатора802803Некоторые из следующих функций возвращают объекты [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo). Для обратной совместимости эти объекты допускают операции, подобные кортежу, над всеми атрибутами, кроме `positions`. Это поведение считается устаревшим и может быть удалено в будущем.804805#### `class inspect.FrameInfo`806807#### `frame`808809[Объект фрейма](https://python-all.ru/3.16/reference/datamodel.html#frame-objects), которому соответствует эта запись.810811#### `filename`812813Имя файла, связанное с кодом, выполняемым фреймом, которому соответствует эта запись.814815#### `lineno`816817Номер текущей строки, связанной с кодом, выполняемым фреймом, которому соответствует эта запись.818819#### `function`820821Имя функции, выполняемой фреймом, соответствующем этой записи.822823#### `code_context`824825Список строк контекста из исходного кода, выполняемого фреймом, которому соответствует эта запись.826827#### `index`828829Индекс текущей выполняемой строки в списке [`code_context`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo.code_context).830831#### `positions`832833Объект [`dis.Positions`](https://python-all.ru/3.16/library/dis.html#dis.Positions), содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанные с инструкцией, выполняемой фреймом, соответствующем этой записи.834835Изменено в версии 3.5: Возвращает [именованный кортеж](https://python-all.ru/3.16/glossary.html#term-named-tuple) вместо [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple).836837Изменено в версии 3.11: `FrameInfo` теперь является экземпляром класса (обратно совместим с предыдущим [именованным кортежем](https://python-all.ru/3.16/glossary.html#term-named-tuple)).838839#### `class inspect.Traceback`840841#### `filename`842843Имя файла, связанное с кодом, выполняемым фреймом, которому соответствует этот traceback.844845#### `lineno`846847Номер текущей строки, связанной с кодом, выполняемым фреймом, которому соответствует этот traceback.848849#### `function`850851Имя функции, выполняемой фреймом, которому соответствует этот traceback.852853#### `code_context`854855Список строк контекста из исходного кода, выполняемого фреймом, которому соответствует этот traceback.856857#### `index`858859Индекс текущей выполняемой строки в списке [`code_context`](https://python-all.ru/3.16/library/inspect.html#inspect.Traceback.code_context).860861#### `positions`862863Объект [`dis.Positions`](https://python-all.ru/3.16/library/dis.html#dis.Positions), содержащий номер начальной строки, номер конечной строки, смещение начального столбца и смещение конечного столбца, связанные с инструкцией, выполняемой фреймом, которому соответствует этот traceback.864865Изменено в версии 3.11: `Traceback` теперь является экземпляром класса (обратно совместим с предыдущим [именованным кортежем](https://python-all.ru/3.16/glossary.html#term-named-tuple)).866867> **Примечание**868>869> Хранение ссылок на объекты фреймов (как в первом элементе записей фреймов, возвращаемых этими функциями) может привести к созданию циклических ссылок в программе. После создания циклической ссылки время жизни всех объектов, доступных из объектов, образующих цикл, может значительно увеличиться, даже если включён дополнительный детектор циклов Python. Если такие циклы необходимо создать, важно убедиться, что они явно разрываются, чтобы избежать задержки уничтожения объектов и увеличения потребления памяти.870>871> Хотя детектор циклов поймает их, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, удалив цикл в предложении [`finally`](https://python-all.ru/3.16/reference/compound_stmts.html#finally). Это также важно, если детектор циклов был отключён при компиляции Python или с помощью [`gc.disable()`](https://python-all.ru/3.16/library/gc.html#gc.disable). Например:872>873> ```python874> def handle_stackframe_without_leak():875>     frame = inspect.currentframe()876>     try:877>         # Выполнить действие с фреймом878>     finally:879>         del frame880> ```881>882> Если нужно сохранить фрейм (например, для последующего вывода traceback), можно также разорвать циклические ссылки с помощью метода [`frame.clear()`](https://python-all.ru/3.16/reference/datamodel.html#frame.clear).883884Необязательный аргумент *context*, поддерживаемый большинством этих функций, задаёт количество возвращаемых строк контекста, которые располагаются вокруг текущей строки.885886#### `inspect.getframeinfo(frame, context=1)`887888Возвращает информацию об объекте фрейма или traceback. Возвращается объект [`Traceback`](https://python-all.ru/3.16/library/inspect.html#inspect.Traceback).889890Изменено в версии 3.11: Возвращается объект [`Traceback`](https://python-all.ru/3.16/library/inspect.html#inspect.Traceback) вместо именованного кортежа.891892#### `inspect.getouterframes(frame, context=1)`893894Возвращает список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo) для фрейма и всех внешних фреймов. Эти фреймы представляют вызовы, которые привели к созданию *frame*. Первый элемент возвращаемого списка представляет *frame*; последний элемент представляет самый внешний вызов в стеке *frame*.895896Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.16/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.897898Изменено в версии 3.11: Возвращается список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo).899900#### `inspect.getinnerframes(traceback, context=1)`901902Получить список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo) для фрейма traceback и всех внутренних фреймов. Эти фреймы представляют вызовы, сделанные в результате *frame*. Первый элемент в списке представляет *traceback*; последний элемент представляет место, где было возбуждено исключение.903904Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.16/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.905906Изменено в версии 3.11: Возвращается список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo).907908#### `inspect.currentframe()`909910Возвращает объект фрейма для фрейма стека вызывающего.911912**Особенность реализации CPython:** Эта функция полагается на поддержку фреймов стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python. Если запустить в реализации без поддержки фреймов стека Python, эта функция возвращает `None`.913914#### `inspect.stack(context=1)`915916Возвращает список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo) для стека вызывающего. Первый элемент возвращаемого списка представляет вызывающего; последний элемент представляет самый внешний вызов в стеке.917918Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.16/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.919920Изменено в версии 3.11: Возвращается список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo).921922#### `inspect.trace(context=1)`923924Возвращает список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo) для стека между текущим фреймом и фреймом, в котором было возбуждено исключение, обрабатываемое в данный момент. Первый элемент списка представляет вызывающего; последний элемент представляет место, где было возбуждено исключение.925926Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.16/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.927928Изменено в версии 3.11: Возвращается список объектов [`FrameInfo`](https://python-all.ru/3.16/library/inspect.html#inspect.FrameInfo).929930## Статическое получение атрибутов931932Как [`getattr()`](https://python-all.ru/3.16/library/functions.html#getattr), так и [`hasattr()`](https://python-all.ru/3.16/library/functions.html#hasattr) могут запускать выполнение кода при получении или проверке существования атрибутов. Дескрипторы, такие как свойства, будут вызваны, а [`__getattr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getattr__) и [`__getattribute__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getattribute__) могут быть вызваны.933934Для случаев, когда требуется пассивная интроспекция, например в инструментах документации, это может быть неудобно. [`getattr_static()`](https://python-all.ru/3.16/library/inspect.html#inspect.getattr_static) имеет сигнатуру, аналогичную [`getattr()`](https://python-all.ru/3.16/library/functions.html#getattr), но не выполняет код при получении атрибутов.935936#### `inspect.getattr_static(obj, attr)`937938#### `inspect.getattr_static(obj, attr, default)`939940Получает атрибуты без запуска динамического поиска через протокол дескрипторов, [`__getattr__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getattribute__).941942Примечание: эта функция может быть не в состоянии получить все атрибуты, которые может получить getattr (например, динамически созданные атрибуты), и может найти атрибуты, которые getattr не может (например, дескрипторы, вызывающие AttributeError). Она также может возвращать объекты дескрипторов вместо членов экземпляра.943944Если атрибут экземпляра [`__dict__`](https://python-all.ru/3.16/reference/datamodel.html#object.__dict__) скрыт другим членом (например, свойством), то эта функция не сможет найти члены экземпляра.945946Добавлено в версии 3.2.947948[`getattr_static()`](https://python-all.ru/3.16/library/inspect.html#inspect.getattr_static) не разрешает дескрипторы, например, дескрипторы слотов или getset-дескрипторы объектов, реализованных на C. Возвращается объект дескриптора, а не базовый атрибут.949950С ними можно работать с помощью кода вроде следующего. Обратите внимание, что для произвольных getset-дескрипторов их вызов может запустить выполнение кода:951952```python953# Пример кода для разрешения встроенных типов дескрипторов954class _foo:955    __slots__ = ['foo']956957slot_descriptor = type(_foo.foo)958getset_descriptor = type(type(open(__file__)).name)959wrapper_descriptor = type(str.__dict__['__add__'])960descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)961962result = getattr_static(some_object, 'foo')963if type(result) in descriptor_types:964    try:965        result = result.__get__()966    except AttributeError:967        # Дескрипторы могут вызывать AttributeError, чтобы968        # указать, что нет нижележащего значения969        # в этом случае сам дескриптор будет970        # придется сделать971        pass972```973974## Текущее состояние генераторов, корутин и асинхронных генераторов975976При реализации планировщиков корутин и для других продвинутых случаев использования генераторов полезно определять, выполняется ли генератор в данный момент, ожидает запуска или возобновления, или уже завершился. [`getgeneratorstate()`](https://python-all.ru/3.16/library/inspect.html#inspect.getgeneratorstate) позволяет легко определить текущее состояние генератора.977978#### `inspect.getgeneratorstate(generator)`979980Возвращает текущее состояние генератора-итератора.981982Возможные состояния:983984- GEN\_CREATED: Ожидание начала выполнения.985- GEN\_RUNNING: В настоящее время выполняется интерпретатором.986- GEN\_SUSPENDED: в данный момент приостановлена на выражении yield.987- GEN\_CLOSED: выполнение завершено.988989Добавлено в версии 3.2.990991#### `inspect.getcoroutinestate(coroutine)`992993Получить текущее состояние объекта корутины. Эта функция предназначена для использования с объектами корутин, созданными функциями [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def), но принимает любой объект, похожий на корутину, который имеет атрибуты `cr_running` и `cr_frame`.994995Возможные состояния:996997- CORO\_CREATED: ожидает начала выполнения.998- CORO\_RUNNING: в данный момент выполняется интерпретатором.999- CORO\_SUSPENDED: в данный момент приостановлена на выражении await.1000- CORO\_CLOSED: выполнение завершено.10011002Добавлено в версии 3.5.10031004#### `inspect.getasyncgenstate(agen)`10051006Получить текущее состояние асинхронного генератора. Эта функция предназначена для использования с асинхронными итераторами, созданными функциями [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def), которые используют оператор [`yield`](https://python-all.ru/3.16/reference/simple_stmts.html#yield), но принимает любой объект, похожий на асинхронный генератор, имеющий атрибуты `ag_running` и `ag_frame`.10071008Возможные состояния:10091010- AGEN\_CREATED: ожидает начала выполнения.1011- AGEN\_RUNNING: в данный момент выполняется интерпретатором.1012- AGEN\_SUSPENDED: в данный момент приостановлена на выражении yield.1013- AGEN\_CLOSED: выполнение завершено.10141015Добавлено в версии 3.12.10161017Текущее внутреннее состояние генератора также можно запросить. Это полезно в основном для целей тестирования, чтобы убедиться, что внутреннее состояние обновляется должным образом:10181019#### `inspect.getgeneratorlocals(generator)`10201021Получить соответствие текущих значений активных локальных переменных в *generator*. Возвращается словарь, отображающий имена переменных в их значения. Это эквивалентно вызову [`locals()`](https://python-all.ru/3.16/library/functions.html#locals) в теле генератора, и действуют все те же предостережения.10221023Если *generator* является [генератором](https://python-all.ru/3.16/glossary.html#term-generator) без текущего связанного фрейма, возвращается пустой словарь. [`TypeError`](https://python-all.ru/3.16/library/exceptions.html#TypeError) возникает, если *generator* не является объектом генератора Python.10241025**Деталь реализации CPython:** Эта функция полагается на то, что генератор предоставляет стековый фрейм Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда будет возвращать пустой словарь.10261027Добавлено в версии 3.3.10281029#### `inspect.getcoroutinelocals(coroutine)`10301031Эта функция аналогична [`getgeneratorlocals()`](https://python-all.ru/3.16/library/inspect.html#inspect.getgeneratorlocals), но работает для объектов корутин, созданных функциями [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def).10321033Добавлено в версии 3.5.10341035#### `inspect.getasyncgenlocals(agen)`10361037Эта функция аналогична [`getgeneratorlocals()`](https://python-all.ru/3.16/library/inspect.html#inspect.getgeneratorlocals), но работает для объектов асинхронных генераторов, созданных функциями [`async def`](https://python-all.ru/3.16/reference/compound_stmts.html#async-def), использующими оператор [`yield`](https://python-all.ru/3.16/reference/simple_stmts.html#yield).10381039Добавлено в версии 3.12.10401041## Битовые флаги объектов кода10421043Объекты кода Python имеют атрибут [`co_flags`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_flags), который представляет собой битовую маску следующих флагов:10441045#### `inspect.CO_OPTIMIZED`10461047Объект кода оптимизирован с использованием быстрых локальных переменных.10481049#### `inspect.CO_NEWLOCALS`10501051Если установлен, при выполнении объекта кода будет создан новый словарь для [`f_locals`](https://python-all.ru/3.16/reference/datamodel.html#frame.f_locals) фрейма.10521053#### `inspect.CO_VARARGS`10541055Объект кода имеет переменный позиционный параметр (аналог `*args`).10561057#### `inspect.CO_VARKEYWORDS`10581059Объект кода имеет переменный ключевой параметр (аналог `**kwargs`).10601061#### `inspect.CO_NESTED`10621063Флаг устанавливается, когда объект кода представляет собой вложенную функцию.10641065#### `inspect.CO_GENERATOR`10661067Флаг устанавливается, когда объект кода является функцией-генератором, т.е. при выполнении объекта кода возвращается объект генератора.10681069#### `inspect.CO_COROUTINE`10701071Флаг устанавливается, когда объект кода является корутинной функцией. При выполнении объекта кода возвращается объект корутины. Подробнее см. [**PEP 492**](https://python-all.ru/3.16/library/inspect.html).10721073Добавлено в версии 3.5.10741075#### `inspect.CO_ITERABLE_COROUTINE`10761077Флаг используется для преобразования генераторов в корутины на основе генераторов. Объекты-генераторы с этим флагом можно использовать в выражении `await`, и они могут `yield from` объекты корутин. Подробнее см. [**PEP 492**](https://python-all.ru/3.16/library/inspect.html).10781079Добавлено в версии 3.5.10801081#### `inspect.CO_ASYNC_GENERATOR`10821083Флаг устанавливается, когда объект кода является асинхронной функцией-генератором. При выполнении объекта кода возвращается объект асинхронного генератора. Подробнее см. [**PEP 525**](https://python-all.ru/3.16/library/inspect.html).10841085Добавлено в версии 3.6.10861087#### `inspect.CO_HAS_DOCSTRING`10881089Флаг устанавливается, если для объекта кода есть строка документации в исходном коде. Если флаг установлен, эта строка будет первым элементом в [`co_consts`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_consts).10901091Добавлено в версии 3.14.10921093#### `inspect.CO_METHOD`10941095Флаг устанавливается, когда объект кода является функцией, определённой внутри класса.10961097Добавлено в версии 3.14.10981099> **Примечание**1100>1101> Эти флаги специфичны для CPython и могут быть не определены в других реализациях Python. Кроме того, флаги являются деталью реализации и могут быть удалены или объявлены устаревшими в будущих версиях Python. Для любых задач интроспекции рекомендуется использовать публичные API из модуля `inspect`.11021103## Флаги буфера11041105#### `class inspect.BufferFlags`11061107Это [`enum.IntFlag`](https://python-all.ru/3.16/library/enum.html#enum.IntFlag), представляющий флаги, которые можно передавать методу [`__buffer__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__buffer__) объектов, реализующих [буферный протокол](https://python-all.ru/3.16/c-api/buffer.html#bufferobjects).11081109Значение флагов объясняется в разделе [Типы запросов буфера](https://python-all.ru/3.16/c-api/buffer.html#buffer-request-types).11101111#### `SIMPLE`11121113#### `WRITABLE`11141115#### `FORMAT`11161117#### `ND`11181119#### `STRIDES`11201121#### `C_CONTIGUOUS`11221123#### `F_CONTIGUOUS`11241125#### `ANY_CONTIGUOUS`11261127#### `INDIRECT`11281129#### `CONTIG`11301131#### `CONTIG_RO`11321133#### `STRIDED`11341135#### `STRIDED_RO`11361137#### `RECORDS`11381139#### `RECORDS_RO`11401141#### `FULL`11421143#### `FULL_RO`11441145#### `READ`11461147#### `WRITE`11481149Добавлено в версии 3.12.11501151## Интерфейс командной строки11521153Модуль `inspect` также предоставляет базовые возможности интроспекции из командной строки.11541155По умолчанию принимает имя модуля и выводит исходный код этого модуля. Класс или функцию внутри модуля можно вывести, добавив двоеточие и полное имя целевого объекта.11561157#### `--details`11581159Выводит информацию об указанном объекте, а не его исходный код.11601161Изменено в версии 3.15: Опция `--details` теперь поддерживает базовую интроспекцию для модулей без доступного исходного кода и сообщает, когда модули заморожены. Также сообщается, когда указанная ссылка на объект не является каноническим именем указанного объекта.1162