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

inspect.md

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

1> **Источник:** https://python-all.ru/3.6/library/inspect.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 29.12. [`inspect`](https://python-all.ru/3.6/library/inspect.html#module-inspect) – Инспекция активных объектов89**Исходный код:** [Lib/inspect.py](https://python-all.ru/src/3.6/Lib/inspect.py)1011---1213Модуль [`inspect`](https://python-all.ru/3.6/library/inspect.html#module-inspect) предоставляет несколько полезных функций для получения информации о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты кадров и объекты кода. Например, он позволяет изучить содержимое класса, получить исходный код метода, извлечь и отформатировать список аргументов функции или получить всю информацию, необходимую для вывода подробной трассировки.1415Этот модуль предоставляет четыре основных вида сервисов: проверка типов, получение исходного кода, инспекция классов и функций, а также анализ стека интерпретатора.1617## 29.12.1. Типы и члены1819Функция [`getmembers()`](https://python-all.ru/3.6/library/inspect.html#inspect.getmembers) извлекает члены объекта, например класса или модуля. Функции, имена которых начинаются с «is», в основном предоставляются как удобные варианты для второго аргумента [`getmembers()`](https://python-all.ru/3.6/library/inspect.html#inspect.getmembers). Они также помогают определить, когда можно ожидать появления следующих специальных атрибутов:2021| Тип | Атрибут | Описание |22| --- | --- | --- |23| модуль | doc | строка документации |24|  | file | filename (отсутствует для встроенных модулей) |25| класс | doc | строка документации |26|  | name | имя, под которым был определён этот класс |27|  | qualname | полное имя |28|  | module | имя модуля, в котором был определён этот класс |29| метод | doc | строка документации |30|  | name | имя, под которым был определён этот метод |31|  | qualname | полное имя |32|  | func | объект функции, содержащий реализацию метода |33|  | self | экземпляр, к которому привязан этот метод, или `None` |34| функция | doc | строка документации |35|  | name | имя, под которым была определена эта функция |36|  | qualname | полное имя |37|  | code | объект кода, содержащий скомпилированную функцию [байткод](https://python-all.ru/3.6/glossary.html#term-bytecode) |38|  | defaults | кортеж значений по умолчанию для позиционных или именованных параметров |39|  | kwdefaults | отображение значений по умолчанию для параметров, доступных только по ключевым словам |40|  | globals | глобальное пространство имён, в котором была определена эта функция |41|  | annotations | отображение имён параметров в аннотации; ключ `"return"` зарезервирован для аннотаций возвращаемого значения. |42| трассировка | tb\_frame | объект фрейма на этом уровне |43|  | tb\_lasti | индекс последней предпринятой инструкции в байткоде |44|  | tb\_lineno | текущий номер строки в исходном коде Python |45|  | tb\_next | следующий внутренний объект traceback (вызванный на этом уровне) |46| фрейм | f\_back | следующий внешний объект фрейма (вызывающий этот фрейм) |47|  | f\_builtins | пространство имён builtins, видимое этим фреймом |48|  | f\_code | объект кода, выполняющийся в этом фрейме |49|  | f\_globals | глобальное пространство имён, видимое этим фреймом |50|  | f\_lasti | индекс последней предпринятой инструкции в байткоде |51|  | f\_lineno | текущий номер строки в исходном коде Python |52|  | f\_locals | локальное пространство имён, видимое этим фреймом |53|  | f\_trace | функция трассировки для этого фрейма или `None` |54| код | co\_argcount | количество аргументов (не включая только именованные аргументы, \* или \*\* args) |55|  | co\_code | строка сырого скомпилированного байткода |56|  | co\_cellvars | кортеж имён клеточных переменных (используемых в объёмлющих областях видимости) |57|  | co\_consts | кортеж констант, используемых в байткоде |58|  | co\_filename | имя файла, в котором был создан этот объект кода |59|  | co\_firstlineno | номер первой строки в исходном коде Python |60|  | co\_flags | битовая маска флагов `CO_*`, подробнее [здесь](https://python-all.ru/3.6/library/inspect.html#inspect-module-co-flags) |61|  | co\_lnotab | кодированное отображение номеров строк на индексы байт-кода |62|  | co\_freevars | кортеж имён свободных переменных (на которые есть ссылка через замыкание функции) |63|  | co\_kwonlyargcount | количество только ключевых аргументов (не включая \*\* arg) |64|  | co\_name | имя, с которым был определён этот объект кода |65|  | co\_names | кортеж имён локальных переменных |66|  | co\_nlocals | количество локальных переменных |67|  | co\_stacksize | требуемый размер стека виртуальной машины |68|  | co\_varnames | кортеж имён аргументов и локальных переменных |69| генератор | name | имя |70|  | qualname | полное имя |71|  | gi\_frame | фрейм |72|  | gi\_running | выполняется ли генератор? |73|  | gi\_code | код |74|  | gi\_yieldfrom | объект, итерируемый `yield from`, или `None` |75| корутина | name | имя |76|  | qualname | полное имя |77|  | cr\_await | ожидаемый объект, или `None` |78|  | cr\_frame | фрейм |79|  | cr\_running | выполняется ли корутина? |80|  | cr\_code | код |81| встроенный | doc | строка документации |82|  | name | исходное имя этой функции или метода |83|  | qualname | полное имя |84|  | self | экземпляр, к которому привязан метод, или `None` |8586Изменено в версии 3.5: Добавлены атрибуты `__qualname__` и `gi_yieldfrom` для генераторов.8788Атрибут `__name__` генераторов теперь устанавливается из имени функции, а не из имени кода, и его можно изменять.8990#### `inspect.getmembers(object[, predicate])`9192Возвращает все члены объекта в виде списка пар (имя, значение), отсортированных по имени. Если передан необязательный аргумент *predicate*, включаются только те члены, для которых предикат возвращает истинное значение.9394> **Примечание**95>96> [`getmembers()`](https://python-all.ru/3.6/library/inspect.html#inspect.getmembers) возвращает только атрибуты класса, определённые в метаклассе, когда аргумент является классом, и эти атрибуты были перечислены в пользовательском [`__dir__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__dir__) метакласса.9798#### `inspect.getmodulename(path)`99100Возвращает имя модуля, заданного файлом *path*, без включения имён объемлющих пакетов. Расширение файла проверяется по всем записям в [`importlib.machinery.all_suffixes()`](https://python-all.ru/3.6/library/importlib.html#importlib.machinery.all_suffixes). Если совпадение найдено, возвращается последний компонент пути с удалённым расширением. В противном случае возвращается `None`.101102Обратите внимание, что эта функция *только* возвращает осмысленное имя для реальных модулей Python – пути, которые потенциально относятся к пакетам Python, всё равно вернут `None`.103104Изменено в версии 3.3: Функция теперь основана непосредственно на [`importlib`](https://python-all.ru/3.6/library/importlib.html#module-importlib).105106#### `inspect.ismodule(object)`107108Возвращает True, если объект является модулем.109110#### `inspect.isclass(object)`111112Возвращает True, если объект является классом, встроенным или созданным в коде Python.113114#### `inspect.ismethod(object)`115116Возвращает True, если объект является связанным методом, написанным на Python.117118#### `inspect.isfunction(object)`119120Возвращает True, если объект является функцией Python, включая функции, созданные с помощью выражения [lambda](https://python-all.ru/3.6/glossary.html#term-lambda).121122#### `inspect.isgeneratorfunction(object)`123124Возвращает True, если объект является функцией-генератором Python.125126#### `inspect.isgenerator(object)`127128Возвращает True, если объект является генератором.129130#### `inspect.iscoroutinefunction(object)`131132Возвращает True, если объект является [корутинной функцией](https://python-all.ru/3.6/glossary.html#term-coroutine-function) (функцией, определённой с помощью синтаксиса [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def)).133134Новое в версии 3.5.135136#### `inspect.iscoroutine(object)`137138Возвращает True, если объект является [корутиной](https://python-all.ru/3.6/glossary.html#term-coroutine), созданной функцией [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def).139140Новое в версии 3.5.141142#### `inspect.isawaitable(object)`143144Возвращает True, если объект может быть использован в выражении [`await`](https://python-all.ru/3.6/reference/expressions.html#await).145146Также может использоваться для отличия корутин на основе генераторов от обычных генераторов:147148```python149def gen():150    yield151@types.coroutine152def gen_coro():153    yield154155assert not isawaitable(gen())156assert isawaitable(gen_coro())157```158159Новое в версии 3.5.160161#### `inspect.isasyncgenfunction(object)`162163Возвращает True, если объект является функцией [асинхронного генератора](https://python-all.ru/3.6/glossary.html#term-asynchronous-generator), например:164165```python166>>> async def agen():167...     yield 1168...169>>> inspect.isasyncgenfunction(agen)170True171```172173Новое в версии 3.6.174175#### `inspect.isasyncgen(object)`176177Возвращает True, если объект является [итератором асинхронного генератора](https://python-all.ru/3.6/glossary.html#term-asynchronous-generator-iterator), созданным функцией [асинхронного генератора](https://python-all.ru/3.6/glossary.html#term-asynchronous-generator).178179Новое в версии 3.6.180181#### `inspect.istraceback(object)`182183Возвращает True, если объект является трассировкой.184185#### `inspect.isframe(object)`186187Возвращает True, если объект является фреймом.188189#### `inspect.iscode(object)`190191Возвращает True, если объект является кодом.192193#### `inspect.isbuiltin(object)`194195Возвращает True, если объект является встроенной функцией или связанным встроенным методом.196197#### `inspect.isroutine(object)`198199Возвращает True, если объект является пользовательской или встроенной функцией или методом.200201#### `inspect.isabstract(object)`202203Возвращает True, если объект является абстрактным базовым классом.204205#### `inspect.ismethoddescriptor(object)`206207Возвращает True, если объект является дескриптором метода, но не в случае, если [`ismethod()`](https://python-all.ru/3.6/library/inspect.html#inspect.ismethod), [`isclass()`](https://python-all.ru/3.6/library/inspect.html#inspect.isclass), [`isfunction()`](https://python-all.ru/3.6/library/inspect.html#inspect.isfunction) или [`isbuiltin()`](https://python-all.ru/3.6/library/inspect.html#inspect.isbuiltin) истинны.208209Это верно, например, для `int.__add__`. Объект, проходящий эту проверку, имеет метод [`__get__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__get__), но не имеет метода [`__set__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__set__), однако помимо этого набор атрибутов различается. Атрибут [`__name__`](https://python-all.ru/3.6/library/stdtypes.html#definition.__name__) обычно имеет смысл, а `__doc__` часто – тоже.210211Методы, реализованные через дескрипторы, которые также проходят один из других тестов, возвращают false для теста [`ismethoddescriptor()`](https://python-all.ru/3.6/library/inspect.html#inspect.ismethoddescriptor), просто потому, что другие тесты обещают больше – например, можно рассчитывать на наличие атрибута `__func__` (и т.д.), когда объект проходит [`ismethod()`](https://python-all.ru/3.6/library/inspect.html#inspect.ismethod).212213#### `inspect.isdatadescriptor(object)`214215Возвращает True, если объект является дескриптором данных.216217Дескрипторы данных имеют оба метода – [`__get__`](https://python-all.ru/3.6/reference/datamodel.html#object.__get__) и [`__set__`](https://python-all.ru/3.6/reference/datamodel.html#object.__set__). Примерами являются свойства (определённые в Python), getsets и members. Последние два определены в C, и для этих типов существуют более специальные проверки, что надёжно во всех реализациях Python. Обычно дескрипторы данных также имеют атрибуты [`__name__`](https://python-all.ru/3.6/library/stdtypes.html#definition.__name__) и `__doc__` (свойства, getsets и members имеют оба этих атрибута), но это не гарантируется.218219#### `inspect.isgetsetdescriptor(object)`220221Возвращает True, если объект является дескриптором getset.222223**Особенность реализации CPython:** getsets – это атрибуты, определённые в модулях расширения через структуры [`PyGetSetDef`](https://python-all.ru/3.6/c-api/structures.html#c.PyGetSetDef). Для реализаций Python без таких типов этот метод всегда будет возвращать `False`.224225#### `inspect.ismemberdescriptor(object)`226227Возвращает True, если объект является дескриптором члена.228229**Особенности реализации CPython:** Дескрипторы членов – это атрибуты, определённые в модулях расширения через структуры [`PyMemberDef`](https://python-all.ru/3.6/c-api/structures.html#c.PyMemberDef). В реализациях Python без таких типов этот метод всегда возвращает `False`.230231## 29.12.2. Получение исходного кода232233#### `inspect.getdoc(object)`234235Возвращает строку документации для объекта, очищенную с помощью [`cleandoc()`](https://python-all.ru/3.6/library/inspect.html#inspect.cleandoc). Если строка документации для объекта не указана, а сам объект является классом, методом, свойством или дескриптором, строка документации извлекается из иерархии наследования.236237Изменено в версии 3.5: Теперь строки документации наследуются, если не переопределены.238239#### `inspect.getcomments(object)`240241Возвращает в виде одной строки все строки комментариев, непосредственно предшествующие исходному коду объекта (для класса, функции или метода), либо в начале Python-файла (если объект – модуль). Если исходный код объекта недоступен, возвращает `None`. Это может произойти, если объект определён на C или в интерактивной оболочке.242243#### `inspect.getfile(object)`244245Возвращает имя (текстового или бинарного) файла, в котором определён объект. Вызывает исключение [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError), если объект – встроенный модуль, класс или функция.246247#### `inspect.getmodule(object)`248249Пытается определить модуль, в котором был определён объект.250251#### `inspect.getsourcefile(object)`252253Возвращает имя файла исходного кода Python, в котором был определён объект. Вызовет исключение [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError), если объект является встроенным модулем, классом или функцией.254255#### `inspect.getsourcelines(object)`256257Возвращает список строк исходного кода и номер начальной строки для объекта. Аргументом может быть модуль, класс, метод, функция, объект трассировки, фрейм или объект кода. Исходный код возвращается в виде списка строк, соответствующих объекту, а номер строки указывает, где в исходном файле находится первая строка кода. Если исходный код не удаётся получить, возбуждается исключение [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).258259Изменено в версии 3.3: [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError) вызывается вместо [`IOError`](https://python-all.ru/3.6/library/exceptions.html#IOError), который теперь является его псевдонимом.260261#### `inspect.getsource(object)`262263Возвращает текст исходного кода для объекта. Аргументом может быть модуль, класс, метод, функция, объект трассировки, фрейм или объект кода. Исходный код возвращается в виде одной строки. Если исходный код не удаётся получить, возбуждается исключение [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError).264265Изменено в версии 3.3: [`OSError`](https://python-all.ru/3.6/library/exceptions.html#OSError) вызывается вместо [`IOError`](https://python-all.ru/3.6/library/exceptions.html#IOError), который теперь является его псевдонимом.266267#### `inspect.cleandoc(doc)`268269Убирает отступы из docstrings, которые выровнены с блоками кода.270271Из первой строки удаляются все начальные пробелы. Все начальные пробелы, которые можно равномерно удалить со второй строки и далее, также удаляются. Пустые строки в начале и конце удаляются. Кроме того, все табуляции заменяются пробелами.272273## 29.12.3. Интроспекция вызываемых объектов с помощью объекта Signature274275Новое в версии 3.3.276277Объект Signature представляет сигнатуру вызова вызываемого объекта и его аннотацию возвращаемого значения. Чтобы получить объект Signature, используйте функцию [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature).278279#### `inspect.signature(callable, *, follow_wrapped=True)`280281Возвращает объект [`Signature`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature) для заданного `callable`:282283```python284>>> from inspect import signature285>>> def foo(a, *, b:int, **kwargs):286...     pass287288>>> sig = signature(foo)289290>>> str(sig)291'(a, *, b:int, **kwargs)'292293>>> str(sig.parameters['b'])294'b:int'295296>>> sig.parameters['b'].annotation297<class 'int'>298```299300Принимает широкий спектр вызываемых объектов Python: от обычных функций и классов до объектов [`functools.partial()`](https://python-all.ru/3.6/library/functools.html#functools.partial).301302Возбуждает исключение [`ValueError`](https://python-all.ru/3.6/library/exceptions.html#ValueError), если сигнатура не может быть предоставлена, и [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError), если такой тип объекта не поддерживается.303304Новое в версии 3.5: `follow_wrapped` параметр. Передайте `False`, чтобы получить сигнатуру `callable` конкретно (`callable.__wrapped__` не будет использоваться для разворачивания декорированных вызываемых объектов).305306> **Примечание**307>308> Некоторые вызываемые объекты могут быть недоступны для интроспекции в определённых реализациях Python. Например, в CPython некоторые встроенные функции, определённые на C, не предоставляют метаданных о своих аргументах.309310#### `class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)`311312Объект Signature представляет сигнатуру вызова функции и её аннотацию возвращаемого значения. Для каждого параметра, принимаемого функцией, он сохраняет объект [`Parameter`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter) в своей коллекции [`parameters`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.parameters).313314Необязательный аргумент *parameters* – это последовательность объектов [`Parameter`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter), которая проверяется на отсутствие дублирующихся имён параметров и на правильный порядок: сначала только позиционные, затем позиционно-ключевые, а параметры со значениями по умолчанию следуют за параметрами без них.315316Необязательный аргумент *return\_annotation* может быть произвольным объектом Python и является аннотацией возвращаемого значения вызываемого объекта.317318Объекты Signature *неизменяемы*. Используйте [`Signature.replace()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.replace) для создания изменённой копии.319320Изменено в версии 3.5: Объекты Signature можно сериализовать и хэшировать.321322#### `empty`323324Специальный маркер уровня класса для указания отсутствия аннотации возврата.325326#### `parameters`327328Упорядоченное отображение имён параметров на соответствующие объекты [`Parameter`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter).329330#### `return_annotation`331332Аннотация «return» вызываемого объекта. Если у вызываемого объекта нет аннотации «return», этот атрибут устанавливается в [`Signature.empty`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.empty).333334#### `bind(*args, **kwargs)`335336Создаёт отображение позиционных и ключевых аргументов в параметры. Возвращает [`BoundArguments`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments), если `*args` и `**kwargs` соответствуют сигнатуре, или вызывает [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError).337338#### `bind_partial(*args, **kwargs)`339340Работает так же, как [`Signature.bind()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind), но позволяет опускать некоторые обязательные аргументы (имитирует поведение [`functools.partial()`](https://python-all.ru/3.6/library/functools.html#functools.partial)). Возвращает [`BoundArguments`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments) или вызывает [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError), если переданные аргументы не соответствуют сигнатуре.341342#### `replace(*[, parameters][, return_annotation])`343344Создаёт новый экземпляр Signature на основе экземпляра, для которого был вызван replace. Можно передать другие `parameters` и/или `return_annotation`, чтобы переопределить соответствующие свойства базовой сигнатуры. Чтобы удалить return\_annotation из скопированной сигнатуры, укажите [`Signature.empty`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.empty).345346```python347>>> def test(a, b):348...     pass349>>> sig = signature(test)350>>> new_sig = sig.replace(return_annotation="new return anno")351>>> str(new_sig)352"(a, b) -> 'new return anno'"353```354355#### `classmethod from_callable(obj, *, follow_wrapped=True)`356357Возвращает объект [`Signature`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature) (или его подкласс) для заданного вызываемого объекта `obj`. Передайте `follow_wrapped=False`, чтобы получить сигнатуру `obj` без разворачивания цепочки `__wrapped__`.358359Этот метод упрощает создание подклассов [`Signature`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature):360361```python362class MySignature(Signature):363    pass364sig = MySignature.from_callable(min)365assert isinstance(sig, MySignature)366```367368Новое в версии 3.5.369370#### `class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)`371372Объекты Parameter являются *неизменяемыми*. Вместо изменения объекта Parameter можно использовать [`Parameter.replace()`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter.replace) для создания изменённой копии.373374Изменено в версии 3.5: Объекты Parameter можно сериализовать и хэшировать.375376#### `empty`377378Специальный маркер уровня класса для указания отсутствия значений по умолчанию и аннотаций.379380#### `name`381382Имя параметра в виде строки. Имя должно быть допустимым идентификатором Python.383384**Особенности реализации CPython:** CPython генерирует неявные имена параметров вида `.0` в объектах кода, используемых для реализации включений (comprehensions) и выражений-генераторов.385386Изменено в версии 3.6: Имена этих параметров предоставляются данным модулем как имена: `implicit0`.387388#### `default`389390Значение параметра по умолчанию. Если у параметра нет значения по умолчанию, этот атрибут устанавливается в [`Parameter.empty`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter.empty).391392#### `annotation`393394Аннотация параметра. Если у параметра нет аннотации, этот атрибут устанавливается в [`Parameter.empty`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter.empty).395396#### `kind`397398Описывает, как значения аргументов привязываются к параметру. Возможные значения (доступны через [`Parameter`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter), например `Parameter.KEYWORD_ONLY`):399400| Имя | Значение |401| --- | --- |402| *POSITIONAL\_ONLY* | Значение должно передаваться как позиционный аргумент. В Python нет явного синтаксиса для определения только позиционных параметров, но многие встроенные функции и функции модулей расширения (особенно те, что принимают только один или два параметра) их поддерживают. |403| *POSITIONAL\_OR\_KEYWORD* | Значение может передаваться как ключевой, так и позиционный аргумент (это стандартное поведение привязки для функций, реализованных на Python). |404| *VAR\_POSITIONAL* | Кортеж позиционных аргументов, которые не привязаны ни к одному другому параметру. Это соответствует параметру `*args` в определении функции Python. |405| *KEYWORD\_ONLY* | Значение должно передаваться как ключевой аргумент. Параметры только для ключевой передачи – это те, которые находятся после записи `*` или `*args` в определении функции Python. |406| *VAR\_KEYWORD* | Словарь ключевых аргументов, которые не привязаны ни к одному другому параметру. Это соответствует параметру `**kwargs` в определении функции Python. |407408Пример: вывод всех аргументов только для ключевой передачи без значений по умолчанию:409410```python411>>> def foo(a, b, *, c, d=10):412...     pass413414>>> sig = signature(foo)415>>> for param in sig.parameters.values():416...     if (param.kind == param.KEYWORD_ONLY and417...                        param.default is param.empty):418...         print('Parameter:', param)419Parameter: c420```421422#### `replace(*[, name][, kind][, default][, annotation])`423424> Создаёт новый экземпляр Parameter на основе экземпляра, для которого был вызван метод. Чтобы переопределить атрибут [`Parameter`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter), передайте соответствующий аргумент. Чтобы удалить значение по умолчанию и/или аннотацию из Parameter, передайте [`Parameter.empty`](https://python-all.ru/3.6/library/inspect.html#inspect.Parameter.empty).425>426> ```python427> >>> from inspect import Parameter428> >>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42)429> >>> str(param)430> 'foo=42'431>432> >>> str(param.replace()) # Создаст поверхностную копию 'param'433> 'foo=42'434>435> >>> str(param.replace(default=Parameter.empty, annotation='spam'))436> "foo:'spam'"437> ```438439Изменено в версии 3.4: В Python 3.3 объектам Parameter разрешалось иметь `name`, установленным в `None`, если их `kind` был установлен в `POSITIONAL_ONLY`. Теперь это запрещено.440441#### `class inspect.BoundArguments`442443Результат вызова [`Signature.bind()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind) или [`Signature.bind_partial()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind_partial). Содержит отображение аргументов на параметры функции.444445#### `arguments`446447Упорядоченное изменяемое отображение ([`collections.OrderedDict`](https://python-all.ru/3.6/library/collections.html#collections.OrderedDict)) имён параметров на значения аргументов. Содержит только явно привязанные аргументы. Изменения в [`arguments`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.arguments) отразятся в [`args`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.args) и [`kwargs`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.kwargs).448449Следует использовать совместно с [`Signature.parameters`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.parameters) для любых целей обработки аргументов.450451> **Примечание**452>453> Аргументы, для которых [`Signature.bind()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind) или [`Signature.bind_partial()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind_partial) полагались на значение по умолчанию, пропускаются. Однако при необходимости используйте [`BoundArguments.apply_defaults()`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.apply_defaults), чтобы добавить их.454455#### `args`456457Кортеж значений позиционных аргументов. Динамически вычисляется из атрибута [`arguments`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.arguments).458459#### `kwargs`460461Словарь значений именованных аргументов. Вычисляется динамически из атрибута [`arguments`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.arguments).462463#### `signature`464465Ссылка на родительский объект [`Signature`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature).466467#### `apply_defaults()`468469Устанавливает значения по умолчанию для отсутствующих аргументов.470471Для переменных позиционных аргументов (`*args`) значением по умолчанию является пустой кортеж.472473Для переменных именованных аргументов (`**kwargs`) значением по умолчанию является пустой словарь.474475```python476>>> def foo(a, b='ham', *args): pass477>>> ba = inspect.signature(foo).bind('spam')478>>> ba.apply_defaults()479>>> ba.arguments480OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])481```482483Новое в версии 3.5.484485Свойства [`args`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.args) и [`kwargs`](https://python-all.ru/3.6/library/inspect.html#inspect.BoundArguments.kwargs) можно использовать для вызова функций:486487```python488def test(a, *, b):489    ...490491sig = signature(test)492ba = sig.bind(10, b=20)493test(*ba.args, **ba.kwargs)494```495496> **См. также**497>498> **[**PEP 362**](https://python-all.ru/3.6/library/inspect.html) – объект сигнатуры функции.**499>500> Подробная спецификация, детали реализации и примеры.501502## 29.12.4. Классы и функции503504#### `inspect.getclasstree(classes, unique=False)`505506Упорядочивает заданный список классов в иерархию вложенных списков. Если встречается вложенный список, он содержит классы, унаследованные от класса, запись которого непосредственно предшествует этому списку. Каждая запись представляет собой кортеж из двух элементов, содержащий класс и кортеж его базовых классов. Если аргумент *unique* равен true, в возвращаемой структуре появляется ровно одна запись для каждого класса из заданного списка. В противном случае классы, использующие множественное наследование, и их потомки будут появляться несколько раз.507508#### `inspect.getargspec(func)`509510Получает имена и значения по умолчанию параметров функции Python. Возвращается [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple) `ArgSpec(args, varargs, keywords, defaults)`. *args* – список имён параметров. *varargs* и *keywords* – это имена параметров `*` и `**`, либо `None`. *defaults* – кортеж значений аргументов по умолчанию или `None`, если аргументов по умолчанию нет; если этот кортеж содержит *n* элементов, они соответствуют последним *n* элементам, перечисленным в *args*.511512Устарело с версии 3.0: Используйте [`getfullargspec()`](https://python-all.ru/3.6/library/inspect.html#inspect.getfullargspec) для обновлённого API, который обычно является взаимозаменяемой заменой, но также корректно обрабатывает аннотации функций и параметры только для ключевых слов.513514Кроме того, используйте [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature) и [Signature Object](https://python-all.ru/3.6/library/inspect.html#inspect-signature-object), которые предоставляют более структурированный API интроспекции для вызываемых объектов.515516#### `inspect.getfullargspec(func)`517518Возвращает имена и значения по умолчанию параметров функции Python. Возвращается [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple):519520`FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)`521522*args* – список имён позиционных параметров. *varargs* – имя параметра `*` или `None`, если произвольные позиционные аргументы не принимаются. *varkw* – имя параметра `**` или `None`, если произвольные именованные аргументы не принимаются. *defaults**n*-кортеж значений аргументов по умолчанию, соответствующих последним *n* позиционным параметрам, или `None`, если такие значения по умолчанию не заданы. *kwonlyargs* – список имён только-именованных параметров. *kwonlydefaults* – словарь, сопоставляющий имена параметров из *kwonlyargs* значениям по умолчанию, используемым, если аргумент не передан. *annotations* – словарь, сопоставляющий имена параметров аннотациям. Специальный ключ `"return"` используется для указания аннотации возвращаемого значения функции (если она есть).523524Обратите внимание, что [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature) и [объект Signature](https://python-all.ru/3.6/library/inspect.html#inspect-signature-object) предоставляют рекомендуемый API для интроспекции вызываемых объектов и поддерживают дополнительное поведение (например, позиционные аргументы), которое иногда встречается в API модулей расширения. Эта функция сохранена в основном для использования в коде, которому необходима совместимость с API модуля Python 2 `inspect`.525526Изменено в версии 3.4: Эта функция теперь основана на [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature), но по-прежнему игнорирует атрибуты `__wrapped__` и включает уже привязанный первый параметр в вывод сигнатуры для связанных методов.527528Изменено в версии 3.6: Ранее этот метод был объявлен устаревшим в пользу [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature) в Python 3.5, но это решение было отменено, чтобы восстановить чётко поддерживаемый стандартный интерфейс для кода на Python 2/3 из одного источника, который мигрирует от устаревшего API [`getargspec()`](https://python-all.ru/3.6/library/inspect.html#inspect.getargspec).529530#### `inspect.getargvalues(frame)`531532Извлекает информацию об аргументах, переданных в заданный фрейм. Возвращается [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple) `ArgInfo(args, varargs, keywords, locals)`. *args* – список имён аргументов. *varargs* и *keywords* – имена аргументов `*` и `**` или `None`. *locals* – это словарь локальных переменных данного фрейма.533534> **Примечание**535>536> Эта функция была ошибочно помечена как устаревшая в Python 3.5.537538#### `inspect.formatargspec(args[, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations[, formatarg, formatvarargs, formatvarkw, formatvalue, formatreturns, formatannotations]])`539540Форматирует красивое описание аргументов на основе значений, возвращённых [`getfullargspec()`](https://python-all.ru/3.6/library/inspect.html#inspect.getfullargspec).541542Первые семь аргументов: (`args`, `varargs`, `varkw`, `defaults`, `kwonlyargs`, `kwonlydefaults`, `annotations`).543544Остальные шесть аргументов – это функции, которые вызываются для преобразования имён аргументов, имени аргумента `*`, имени аргумента `**`, значений по умолчанию, аннотации возвращаемого значения и отдельных аннотаций в строки соответственно.545546Например:547548```python549>>> from inspect import formatargspec, getfullargspec550>>> def f(a: int, b: float):551...     pass552...553>>> formatargspec(*getfullargspec(f))554'(a: int, b: float)'555```556557Устарело с версии 3.5: Используйте [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature) и [Signature Object](https://python-all.ru/3.6/library/inspect.html#inspect-signature-object), которые предоставляют лучший API интроспекции для вызываемых объектов.558559#### `inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])`560561Форматирует красивое описание аргументов из четырёх значений, возвращаемых [`getargvalues()`](https://python-all.ru/3.6/library/inspect.html#inspect.getargvalues). Аргументы format\* – это соответствующие опциональные функции форматирования, которые вызываются для преобразования имён и значений в строки.562563> **Примечание**564>565> Эта функция была ошибочно помечена как устаревшая в Python 3.5.566567#### `inspect.getmro(cls)`568569Возвращает кортеж базовых классов класса cls, включая cls, в порядке разрешения методов (MRO). Ни один класс не встречается в этом кортеже более одного раза. Обратите внимание, что порядок разрешения методов зависит от типа cls. Если не используется особенная пользовательская метатипизация, cls будет первым элементом кортежа.570571#### `inspect.getcallargs(func, *args, **kwds)`572573Связывает *args* и *kwds* с именами аргументов функции или метода Python *func*, как если бы она была вызвана с ними. Для связанных методов (bound methods) также связывает первый аргумент (обычно названный `self`) с соответствующим экземпляром. Возвращается словарь, отображающий имена аргументов (включая имена аргументов `*` и `**`, если они есть) на их значения из *args* и *kwds*. В случае неправильного вызова *func*, т.е. когда `func(*args, **kwds)` возбудило бы исключение из-за несовместимой сигнатуры, возбуждается исключение того же типа и с тем же или похожим сообщением. Например:574575```python576>>> from inspect import getcallargs577>>> def f(a, b=1, *pos, **named):578...     pass579>>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)}580True581>>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()}582True583>>> getcallargs(f)584Traceback (most recent call last):585...586TypeError: f() missing 1 required positional argument: 'a'587```588589Новое в версии 3.2.590591Устарело с версии 3.5: Используйте [`Signature.bind()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind) и [`Signature.bind_partial()`](https://python-all.ru/3.6/library/inspect.html#inspect.Signature.bind_partial) вместо этого.592593#### `inspect.getclosurevars(func)`594595Извлекает отображение ссылок на внешние имена в функции или методе Python *func* на их текущие значения. Возвращается [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple) `ClosureVars(nonlocals, globals, builtins, unbound)`. *nonlocals* отображает ссылочные имена на переменные лексического замыкания, *globals* – на глобальные переменные модуля функции, а *builtins* – на встроенные имена, видимые из тела функции. *unbound* – множество имён, на которые есть ссылки в функции, но которые не удалось разрешить при текущих глобальных переменных модуля и встроенных именах.596597[`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError) возбуждается, если *func* не является функцией или методом Python.598599Новое в версии 3.3.600601#### `inspect.unwrap(func, *, stop=None)`602603Получает объект, обёрнутый в *func*. Следует по цепочке атрибутов `__wrapped__`, возвращая последний объект в цепочке.604605*stop* – опциональный колбэк, принимающий объект в цепочке обёрток в качестве единственного аргумента, который позволяет досрочно завершить разворачивание, если колбэк возвращает истинное значение. Если колбэк никогда не возвращает истинное значение, возвращается последний объект в цепочке как обычно. Например, [`signature()`](https://python-all.ru/3.6/library/inspect.html#inspect.signature) использует это, чтобы остановить разворачивание, если какой-либо объект в цепочке имеет определённый атрибут `__signature__`.606607[`ValueError`](https://python-all.ru/3.6/library/exceptions.html#ValueError) возбуждается, если обнаружен цикл.608609Новое в версии 3.4.610611## 29.12.5. Стек интерпретатора612613Когда следующие функции возвращают «записи о фреймах», каждая запись представляет собой [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`. Кортеж содержит объект фрейма, имя файла, номер текущей строки, имя функции, список строк контекста из исходного кода и индекс текущей строки в этом списке.614615Изменено в версии 3.5: Возвращает именованный кортеж вместо кортежа.616617> **Примечание**618>619> Хранение ссылок на объекты фреймов (как в первом элементе записей фреймов, возвращаемых этими функциями) может привести к созданию циклических ссылок в программе. После создания циклической ссылки время жизни всех объектов, доступных из объектов, образующих цикл, может значительно увеличиться, даже если включён дополнительный детектор циклов Python. Если такие циклы необходимо создать, важно убедиться, что они явно разрываются, чтобы избежать задержки уничтожения объектов и увеличения потребления памяти.620>621> Хотя детектор циклов поймает их, уничтожение фреймов (и локальных переменных) можно сделать детерминированным, удалив цикл в предложении [`finally`](https://python-all.ru/3.6/reference/compound_stmts.html#finally). Это также важно, если детектор циклов был отключён при компиляции Python или с помощью [`gc.disable()`](https://python-all.ru/3.6/library/gc.html#gc.disable). Например:622>623> ```python624> def handle_stackframe_without_leak():625>     frame = inspect.currentframe()626>     try:627>         # Выполнить действие с фреймом628>     finally:629>         del frame630> ```631>632> Если нужно сохранить фрейм (например, для последующего вывода traceback), можно также разорвать циклические ссылки с помощью метода [`frame.clear()`](https://python-all.ru/3.6/reference/datamodel.html#frame.clear).633634Необязательный аргумент *context*, поддерживаемый большинством этих функций, задаёт количество возвращаемых строк контекста, которые располагаются вокруг текущей строки.635636#### `inspect.getframeinfo(frame, context=1)`637638Возвращает информацию об объекте фрейма или traceback. Возвращается [именованный кортеж](https://python-all.ru/3.6/glossary.html#term-named-tuple) `Traceback(filename, lineno, function, code_context, index)`.639640#### `inspect.getouterframes(frame, context=1)`641642Возвращает список записей о фреймах для фрейма и всех внешних фреймов. Эти фреймы представляют вызовы, которые привели к созданию *frame*. Первый элемент возвращаемого списка представляет *frame*; последний элемент представляет самый внешний вызов в стеке *frame*.643644Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.6/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.645646#### `inspect.getinnerframes(traceback, context=1)`647648Возвращает список записей о фреймах для фрейма traceback и всех внутренних фреймов. Эти фреймы представляют вызовы, являющиеся следствием *frame*. Первый элемент списка представляет *traceback*; последний элемент представляет место, где было возбуждено исключение.649650Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.6/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.651652#### `inspect.currentframe()`653654Возвращает объект фрейма для фрейма стека вызывающего.655656**Особенность реализации CPython:** Эта функция полагается на поддержку фреймов стека Python в интерпретаторе, которая не гарантируется во всех реализациях Python. Если запустить в реализации без поддержки фреймов стека Python, эта функция возвращает `None`.657658#### `inspect.stack(context=1)`659660Возвращает список записей о фреймах для стека вызывающего кода. Первый элемент возвращаемого списка представляет вызывающий код; последний элемент представляет самый внешний вызов в стеке.661662Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.6/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.663664#### `inspect.trace(context=1)`665666Возвращает список записей о фреймах для стека между текущим фреймом и фреймом, в котором было возбуждено исключение, обрабатываемое в данный момент. Первый элемент списка представляет вызывающий код; последний элемент представляет место, где было возбуждено исключение.667668Изменено в версии 3.5: Возвращается список [именованных кортежей](https://python-all.ru/3.6/glossary.html#term-named-tuple) `FrameInfo(frame, filename, lineno, function, code_context, index)`.669670## 29.12.6. Статическое получение атрибутов671672И [`getattr()`](https://python-all.ru/3.6/library/functions.html#getattr), и [`hasattr()`](https://python-all.ru/3.6/library/functions.html#hasattr) могут инициировать выполнение кода при получении или проверке существования атрибутов. Дескрипторы, такие как свойства, будут вызваны, а [`__getattr__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getattr__) и [`__getattribute__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getattribute__) могут быть вызваны.673674В случаях, когда нужна пассивная интроспекция (например, для инструментов документирования), это может быть неудобно. [`getattr_static()`](https://python-all.ru/3.6/library/inspect.html#inspect.getattr_static) имеет ту же сигнатуру, что и [`getattr()`](https://python-all.ru/3.6/library/functions.html#getattr), но не выполняет код при получении атрибутов.675676#### `inspect.getattr_static(obj, attr, default=None)`677678Извлекает атрибуты без запуска динамического поиска через протокол дескрипторов, [`__getattr__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getattr__) или [`__getattribute__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getattribute__).679680Примечание: эта функция может быть не в состоянии получить все атрибуты, которые может получить getattr (например, динамически созданные атрибуты), и может найти атрибуты, которые getattr не может (например, дескрипторы, вызывающие AttributeError). Она также может возвращать объекты дескрипторов вместо членов экземпляра.681682Если атрибут экземпляра [`__dict__`](https://python-all.ru/3.6/library/stdtypes.html#object.__dict__) скрыт другим членом (например, свойством), то эта функция не сможет найти члены экземпляра.683684Новое в версии 3.2.685686[`getattr_static()`](https://python-all.ru/3.6/library/inspect.html#inspect.getattr_static) не разрешает дескрипторы, например, дескрипторы слотов или getset-дескрипторы объектов, реализованных на C. Возвращается объект дескриптора, а не базовый атрибут.687688С ними можно работать с помощью кода вроде следующего. Обратите внимание, что для произвольных getset-дескрипторов их вызов может запустить выполнение кода:689690```python691# Пример кода для разрешения встроенных типов дескрипторов692class _foo:693    __slots__ = ['foo']694695slot_descriptor = type(_foo.foo)696getset_descriptor = type(type(open(__file__)).name)697wrapper_descriptor = type(str.__dict__['__add__'])698descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)699700result = getattr_static(some_object, 'foo')701if type(result) in descriptor_types:702    try:703        result = result.__get__()704    except AttributeError:705        # Дескрипторы могут вызывать AttributeError, чтобы706        # указать, что нет нижележащего значения707        # в этом случае сам дескриптор будет708        # придется сделать709        pass710```711712## 29.12.7. Текущее состояние генераторов и корутин713714При реализации планировщиков корутин и для других продвинутых случаев использования генераторов полезно определять, выполняется ли генератор в данный момент, ожидает запуска или возобновления, или уже завершился. [`getgeneratorstate()`](https://python-all.ru/3.6/library/inspect.html#inspect.getgeneratorstate) позволяет легко определить текущее состояние генератора.715716#### `inspect.getgeneratorstate(generator)`717718Возвращает текущее состояние генератора-итератора.719720**Возможные состояния:**721722- GEN\_CREATED: Ожидание начала выполнения.723- GEN\_RUNNING: В настоящее время выполняется интерпретатором.724- GEN\_SUSPENDED: в данный момент приостановлена на выражении yield.725- GEN\_CLOSED: выполнение завершено.726727Новое в версии 3.2.728729#### `inspect.getcoroutinestate(coroutine)`730731Получить текущее состояние объекта корутины. Эта функция предназначена для использования с объектами корутин, созданными функциями [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def), но принимает любой объект, похожий на корутину, который имеет атрибуты `cr_running` и `cr_frame`.732733**Возможные состояния:**734735- CORO\_CREATED: ожидает начала выполнения.736- CORO\_RUNNING: в данный момент выполняется интерпретатором.737- CORO\_SUSPENDED: в данный момент приостановлена на выражении await.738- CORO\_CLOSED: выполнение завершено.739740Новое в версии 3.5.741742Текущее внутреннее состояние генератора также можно запросить. Это полезно в основном для целей тестирования, чтобы убедиться, что внутреннее состояние обновляется должным образом:743744#### `inspect.getgeneratorlocals(generator)`745746Получить соответствие текущих значений активных локальных переменных в *generator*. Возвращается словарь, отображающий имена переменных в их значения. Это эквивалентно вызову [`locals()`](https://python-all.ru/3.6/library/functions.html#locals) в теле генератора, и действуют все те же предостережения.747748Если *generator* является [генератором](https://python-all.ru/3.6/glossary.html#term-generator) без текущего связанного фрейма, возвращается пустой словарь. [`TypeError`](https://python-all.ru/3.6/library/exceptions.html#TypeError) возникает, если *generator* не является объектом генератора Python.749750**Деталь реализации CPython:** Эта функция полагается на то, что генератор предоставляет стековый фрейм Python для интроспекции, что не гарантируется во всех реализациях Python. В таких случаях эта функция всегда будет возвращать пустой словарь.751752Новое в версии 3.3.753754#### `inspect.getcoroutinelocals(coroutine)`755756Эта функция аналогична [`getgeneratorlocals()`](https://python-all.ru/3.6/library/inspect.html#inspect.getgeneratorlocals), но работает для объектов корутин, созданных функциями [`async def`](https://python-all.ru/3.6/reference/compound_stmts.html#async-def).757758Новое в версии 3.5.759760## 29.12.8. Битовые флаги объектов кода761762Объекты кода Python имеют атрибут `co_flags`, представляющий собой битовую маску следующих флагов:763764#### `inspect.CO_OPTIMIZED`765766Объект кода оптимизирован с использованием быстрых локальных переменных.767768#### `inspect.CO_NEWLOCALS`769770Если установлен, при выполнении объекта кода будет создан новый словарь для `f_locals` фрейма.771772#### `inspect.CO_VARARGS`773774Объект кода имеет переменный позиционный параметр (аналог `*args`).775776#### `inspect.CO_VARKEYWORDS`777778Объект кода имеет переменный ключевой параметр (аналог `**kwargs`).779780#### `inspect.CO_NESTED`781782Флаг устанавливается, когда объект кода представляет собой вложенную функцию.783784#### `inspect.CO_GENERATOR`785786Флаг устанавливается, когда объект кода является функцией-генератором, т.е. при выполнении объекта кода возвращается объект генератора.787788#### `inspect.CO_NOFREE`789790Флаг установлен, если нет свободных переменных или переменных ячейки.791792#### `inspect.CO_COROUTINE`793794Флаг устанавливается, когда объект кода является корутинной функцией. При выполнении объекта кода возвращается объект корутины. Подробнее см. [**PEP 492**](https://python-all.ru/3.6/library/inspect.html).795796Новое в версии 3.5.797798#### `inspect.CO_ITERABLE_COROUTINE`799800Флаг используется для преобразования генераторов в корутины на основе генераторов. Объекты-генераторы с этим флагом можно использовать в выражении `await`, и они могут `yield from` объекты корутин. Подробнее см. [**PEP 492**](https://python-all.ru/3.6/library/inspect.html).801802Новое в версии 3.5.803804#### `inspect.CO_ASYNC_GENERATOR`805806Флаг устанавливается, когда объект кода является асинхронной функцией-генератором. При выполнении объекта кода возвращается объект асинхронного генератора. Подробнее см. [**PEP 525**](https://python-all.ru/3.6/library/inspect.html).807808Новое в версии 3.6.809810> **Примечание**811>812> Эти флаги специфичны для CPython и могут быть не определены в других реализациях Python. Кроме того, флаги являются деталью реализации и могут быть удалены или объявлены устаревшими в будущих версиях Python. Для любых задач интроспекции рекомендуется использовать публичные API из модуля [`inspect`](https://python-all.ru/3.6/library/inspect.html#module-inspect).813814## 29.12.9. Интерфейс командной строки815816Модуль [`inspect`](https://python-all.ru/3.6/library/inspect.html#module-inspect) также предоставляет базовые возможности интроспекции из командной строки.817818По умолчанию принимает имя модуля и выводит его исходный код. Класс или функцию внутри модуля можно вывести, добавив двоеточие и полное имя целевого объекта.819820#### `--details`821822Выводит информацию об указанном объекте, а не его исходный код.823