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

dis.md

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

1> **Источник:** https://python-all.ru/3.6/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 32.12. [`dis`](https://python-all.ru/3.6/library/dis.html#module-dis) – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.6/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.6/library/dis.html#module-dis) поддерживает анализ [байт-кода](https://python-all.ru/3.6/glossary.html#term-bytecode) CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.1617Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.1819Пример: Дана функция `myfunc()`:2021```python22def myfunc(alist):23    return len(alist)24```2526следующую команду можно использовать для отображения дизассемблирования `myfunc()`:2728```python29>>> dis.dis(myfunc)30  2           0 LOAD_GLOBAL              0 (len)31              2 LOAD_FAST                0 (alist)32              4 CALL_FUNCTION            133              6 RETURN_VALUE34```3536(«2» – это номер строки).3738## 32.12.1. Анализ байт-кода3940Новое в версии 3.4.4142API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.6/library/dis.html#dis.Bytecode), который предоставляет удобный доступ к деталям скомпилированного кода.4344#### `class dis.Bytecode(x, *, first_line=None, current_offset=None)`4546Анализирует байт-код, соответствующий функции, генератору, методу, строке\\nисходного кода или объекту кода (возвращаемому [`compile()`](https://python-all.ru/3.6/library/functions.html#compile)).4748Это удобная обёртка над многими функциями, перечисленными ниже, особенно [`get_instructions()`](https://python-all.ru/3.6/library/dis.html#dis.get_instructions), поскольку итерация по экземпляру [`Bytecode`](https://python-all.ru/3.6/library/dis.html#dis.Bytecode) возвращает операции байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.6/library/dis.html#dis.Instruction).4950Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.5152Если *current\_offset* не равно `None`, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что [`dis()`](https://python-all.ru/3.6/library/dis.html#dis.Bytecode.dis) будет отображать маркер «текущая инструкция» напротив указанной операции.5354#### `classmethod from_traceback(tb)`5556Создаёт экземпляр [`Bytecode`](https://python-all.ru/3.6/library/dis.html#dis.Bytecode) из заданного traceback, устанавливая *current\_offset* на инструкцию, ответственную за исключение.5758#### `codeobj`5960Скомпилированный объект кода.6162#### `first_line`6364Первая строка исходного кода объекта кода (если доступна)6566#### `dis()`6768Возвращает форматированное представление операций байткода (то же, что выводится [`dis.dis()`](https://python-all.ru/3.6/library/dis.html#dis.dis), но возвращается в виде многострочной строки).6970#### `info()`7172Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.6/library/dis.html#dis.code_info).7374Пример:7576```python77>>> bytecode = dis.Bytecode(myfunc)78>>> for instr in bytecode:79...     print(instr.opname)80...81LOAD_GLOBAL82LOAD_FAST83CALL_FUNCTION84RETURN_VALUE85```8687## 32.12.2. Функции анализа8889Модуль [`dis`](https://python-all.ru/3.6/library/dis.html#module-dis) также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:9091#### `dis.code_info(x)`9293Возвращает форматированную многострочную строку с подробной информацией об объекте кода\\nдля указанной функции, генератора, метода, строки исходного кода или объекта кода.9495Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.9697Новое в версии 3.2.9899#### `dis.show_code(x, *, file=None)`100101Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или `sys.stdout`, если *file* не указан).102103Это удобная краткая форма для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.104105Новое в версии 3.2.106107Изменено в версии 3.4: Добавлен параметр *file*.108109#### `dis.dis(x=None, *, file=None)`110111Дизассемблирует объект *x*. *x* может обозначать модуль, класс, метод, функцию, генератор, объект кода, строку исходного кода или\\nпоследовательность байтов исходного байт-кода. Для модуля дизассемблируются все функции.\\nДля класса дизассемблируются все методы (включая методы класса и статические методы).\\nДля объекта кода или последовательности байтов исходного байт-кода выводится по одной строке на каждую\\nинструкцию байт-кода. Строки сначала компилируются в объекты кода с помощью [`compile()`](https://python-all.ru/3.6/library/functions.html#compile)\\nвстроенной функции, а затем дизассемблируются. Если объект не указан, эта\\nфункция дизассемблирует последнюю трассировку.112113Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.114115Изменено в версии 3.4: Добавлен параметр *file*.116117#### `dis.distb(tb=None, *, file=None)`118119Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.120121Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.122123Изменено в версии 3.4: Добавлен параметр *file*.124125#### `dis.disassemble(code, lasti=-1, *, file=None)`126127#### `dis.disco(code, lasti=-1, *, file=None)`128129Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:1301311. номер строки для первой инструкции каждой строки1322. текущая инструкция, помечена как `-->`,1333. инструкция с меткой, помечена `>>`,1344. адрес инструкции,1355. название кода операции,1366. параметры операции и1377. интерпретация параметров в скобках.138139Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.140141Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.142143Изменено в версии 3.4: Добавлен параметр *file*.144145#### `dis.get_instructions(x, *, first_line=None)`146147Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.148149Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.6/library/dis.html#dis.Instruction), содержащих сведения о каждой операции в переданном коде.150151Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.152153Новое в версии 3.4.154155#### `dis.findlinestarts(code)`156157Эта функция-генератор использует атрибуты `co_firstlineno` и `co_lnotab` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются как пары `(offset, lineno)`. Описание формата `co_lnotab` и способ его декодирования см. в [Objects/lnotab\_notes.txt](https://python-all.ru/src/3.6/Objects/lnotab_notes.txt).158159Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.160161#### `dis.findlabels(code)`162163Определяет все смещения в объекте кода *code*, которые являются целями перехода, и\\nвозвращает список этих смещений.164165#### `dis.stack_effect(opcode[, oparg])`166167Вычисляет эффект стека для *opcode* с аргументом *oparg*.168169Новое в версии 3.4.170171## 32.12.3. Инструкции байт-кода Python172173Функция [`get_instructions()`](https://python-all.ru/3.6/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.6/library/dis.html#dis.Bytecode) предоставляют сведения об инструкциях байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.6/library/dis.html#dis.Instruction):174175#### `class dis.Instruction`176177Подробности об операции байткода178179#### `opcode`180181Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [коллекциях Opcode](https://python-all.ru/3.6/library/dis.html#opcode-collections).182183#### `opname`184185Человекочитаемое имя операции186187#### `arg`188189числовой аргумент операции (если есть), иначе `None`190191#### `argval`192193разрешённое значение аргумента (если известно), иначе то же, что и arg194195#### `argrepr`196197человекочитаемое описание аргумента операции198199#### `offset`200201начальный индекс операции в последовательности байт-кода202203#### `starts_line`204205Строка, с которой начинается данный опкод (если есть), иначе `None`.206207#### `is_jump_target`208209`True`, если другой код переходит сюда, иначе `False`210211Новое в версии 3.4.212213В настоящее время компилятор Python генерирует следующие инструкции байткода.214215**Общие инструкции**216217**`NOP`**218219Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.220221**`POP_TOP`**222223Удаляет элемент с вершины стека (TOS).224225**`ROT_TWO`**226227Меняет местами два верхних элемента стека.228229**`ROT_THREE`**230231Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.232233**`DUP_TOP`**234235Дублирует ссылку на вершине стека.236237Новое в версии 3.2.238239**`DUP_TOP_TWO`**240241Дублирует две ссылки на вершине стека, сохраняя их порядок.242243Новое в версии 3.2.244245**Унарные операции**246247Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.248249**`UNARY_POSITIVE`**250251Реализует `TOS = +TOS`.252253**`UNARY_NEGATIVE`**254255Реализует `TOS = -TOS`.256257**`UNARY_NOT`**258259Реализует `TOS = not TOS`.260261**`UNARY_INVERT`**262263Реализует `TOS = ~TOS`.264265**`GET_ITER`**266267Реализует `TOS = iter(TOS)`.268269**`GET_YIELD_FROM_ITER`**270271Если `TOS` является объектом [генераторный итератор](https://python-all.ru/3.6/glossary.html#term-generator-iterator) или [корутина](https://python-all.ru/3.6/glossary.html#term-coroutine), он остаётся без изменений. В противном случае реализует `TOS = iter(TOS)`.272273Новое в версии 3.5.274275**Бинарные операции**276277Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.278279**`BINARY_POWER`**280281Реализует `TOS = TOS1 ** TOS`.282283**`BINARY_MULTIPLY`**284285Реализует `TOS = TOS1 * TOS`.286287**`BINARY_MATRIX_MULTIPLY`**288289Реализует `TOS = TOS1 @ TOS`.290291Новое в версии 3.5.292293**`BINARY_FLOOR_DIVIDE`**294295Реализует `TOS = TOS1 // TOS`.296297**`BINARY_TRUE_DIVIDE`**298299Реализует `TOS = TOS1 / TOS`.300301**`BINARY_MODULO`**302303Реализует `TOS = TOS1 % TOS`.304305**`BINARY_ADD`**306307Реализует `TOS = TOS1 + TOS`.308309**`BINARY_SUBTRACT`**310311Реализует `TOS = TOS1 - TOS`.312313**`BINARY_SUBSCR`**314315Реализует `TOS = TOS1[TOS]`.316317**`BINARY_LSHIFT`**318319Реализует `TOS = TOS1 << TOS`.320321**`BINARY_RSHIFT`**322323Реализует `TOS = TOS1 >> TOS`.324325**`BINARY_AND`**326327Реализует `TOS = TOS1 & TOS`.328329**`BINARY_XOR`**330331Реализует `TOS = TOS1 ^ TOS`.332333**`BINARY_OR`**334335Реализует `TOS = TOS1 | TOS`.336337**Операции на месте**338339Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.340341**`INPLACE_POWER`**342343Реализует операцию на месте `TOS = TOS1 ** TOS`.344345**`INPLACE_MULTIPLY`**346347Реализует операцию на месте `TOS = TOS1 * TOS`.348349**`INPLACE_MATRIX_MULTIPLY`**350351Реализует операцию на месте `TOS = TOS1 @ TOS`.352353Новое в версии 3.5.354355**`INPLACE_FLOOR_DIVIDE`**356357Реализует операцию на месте `TOS = TOS1 // TOS`.358359**`INPLACE_TRUE_DIVIDE`**360361Реализует операцию на месте `TOS = TOS1 / TOS`.362363**`INPLACE_MODULO`**364365Реализует операцию на месте `TOS = TOS1 % TOS`.366367**`INPLACE_ADD`**368369Реализует операцию на месте `TOS = TOS1 + TOS`.370371**`INPLACE_SUBTRACT`**372373Реализует операцию на месте `TOS = TOS1 - TOS`.374375**`INPLACE_LSHIFT`**376377Реализует операцию на месте `TOS = TOS1 << TOS`.378379**`INPLACE_RSHIFT`**380381Реализует операцию на месте `TOS = TOS1 >> TOS`.382383**`INPLACE_AND`**384385Реализует операцию на месте `TOS = TOS1 & TOS`.386387**`INPLACE_XOR`**388389Реализует операцию на месте `TOS = TOS1 ^ TOS`.390391**`INPLACE_OR`**392393Реализует операцию на месте `TOS = TOS1 | TOS`.394395**`STORE_SUBSCR`**396397Реализует `TOS1[TOS] = TOS2`.398399**`DELETE_SUBSCR`**400401Реализует `del TOS1[TOS]`.402403**Коды операций корутин**404405**`GET_AWAITABLE`**406407Реализует `TOS = get_awaitable(TOS)`, где `get_awaitable(o)` возвращает `o`, если `o` является объектом корутины или объектом генератора с флагом CO\_ITERABLE\_COROUTINE, или разрешает `o.__await__`.408409Новое в версии 3.5.410411**`GET_AITER`**412413Реализует `TOS = get_awaitable(TOS.__aiter__())`. Подробнее о `get_awaitable` см. в `GET_AWAITABLE`.414415Новое в версии 3.5.416417**`GET_ANEXT`**418419Реализует `PUSH(get_awaitable(TOS.__anext__()))`. Подробнее о `get_awaitable` см. в `GET_AWAITABLE`.420421Новое в версии 3.5.422423**`BEFORE_ASYNC_WITH`**424425Извлекает `__aenter__` и `__aexit__` из объекта на вершине стека. Помещает `__aexit__` и результат `__aenter__()` в стек.426427Новое в версии 3.5.428429**`SETUP_ASYNC_WITH`**430431Создаёт новый объект фрейма.432433Новое в версии 3.5.434435**Прочие опкоды**436437**`PRINT_EXPR`**438439Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью [`POP_TOP`](https://python-all.ru/3.6/library/dis.html#opcode-POP_TOP).440441**`BREAK_LOOP`**442443Завершает цикл при выполнении оператора [`break`](https://python-all.ru/3.6/reference/simple_stmts.html#break).444445**`CONTINUE_LOOP`(*target*)**446447Продолжает цикл при выполнении оператора [`continue`](https://python-all.ru/3.6/reference/simple_stmts.html#continue). *target* – это адрес, на который нужно перейти (должен быть инструкция [`FOR_ITER`](https://python-all.ru/3.6/library/dis.html#opcode-FOR_ITER)).448449**`SET_ADD`(*i*)**450451Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).452453**`LIST_APPEND`(*i*)**454455Вызывает `list.append(TOS[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).456457**`MAP_ADD`(*i*)**458459Вызывает `dict.setitem(TOS1[-i], TOS, TOS1)`. Используется для реализации словарных включений (dict comprehensions).460461Новое в версии 3.1.462463Для всех инструкций [`SET_ADD`](https://python-all.ru/3.6/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.6/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.6/library/dis.html#opcode-MAP_ADD), когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.464465**`RETURN_VALUE`**466467Возвращает TOS вызывающей стороне функции.468469**`YIELD_VALUE`**470471Извлекает TOS и возвращает его из [генератора](https://python-all.ru/3.6/glossary.html#term-generator).472473**`YIELD_FROM`**474475Извлекает TOS и делегирует ему как под-итератор от [генератора](https://python-all.ru/3.6/glossary.html#term-generator).476477Новое в версии 3.3.478479**`SETUP_ANNOTATIONS`**480481Проверяет, определён ли `__annotations__` в `locals()`; если нет, он устанавливается в пустой `dict`. Этот опкод генерируется, только если тело класса или модуля статически содержит [аннотации переменных](https://python-all.ru/3.6/glossary.html#term-variable-annotation).482483Новое в версии 3.6.484485**`IMPORT_STAR`**486487Загружает все имена, не начинающиеся с `'_'`, из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует `from module import *`.488489**`POP_BLOCK`**490491Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, представляющий вложенные циклы, операторы try и т.п.492493**`POP_EXCEPT`**494495Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.496497**`END_FINALLY`**498499Завершает предложение [`finally`](https://python-all.ru/3.6/reference/compound_stmts.html#finally). Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращает значение, и продолжает со следующим внешним блоком.500501**`LOAD_BUILD_CLASS`**502503Помещает `builtins.__build_class__()` в стек. Позже он вызывается [`CALL_FUNCTION`](https://python-all.ru/3.6/library/dis.html#opcode-CALL_FUNCTION) для создания класса.504505**`SETUP_WITH`(*delta*)**506507Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает [`__exit__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__exit__) из менеджера контекста и помещает его в стек для последующего использования `WITH_CLEANUP`. Затем вызывается [`__enter__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__enter__), и в стек помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода enter помещается в стек. Следующая инструкция либо игнорирует его ([`POP_TOP`](https://python-all.ru/3.6/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную(ые) ([`STORE_FAST`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/3.6/library/dis.html#opcode-UNPACK_SEQUENCE)).508509Новое в версии 3.2.510511**`WITH_CLEANUP_START`**512513Очищает стек при выходе из блока оператора [`with`](https://python-all.ru/3.6/reference/compound_stmts.html#with). TOS – это привязанный метод [`__exit__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__exit__) менеджера контекста. Под TOS находятся 1–3 значения, показывающие, как/почему был выполнен блок finally:514515- SECOND = `None`516- (SECOND, THIRD) = (`WHY_{RETURN,CONTINUE}`), retval517- SECOND = `WHY_*`; ниже нет retval518- (SECOND, THIRD, FOURTH) = exc\_info()519520В последнем случае вызывается `TOS(SECOND, THIRD, FOURTH)`, иначе `TOS(None, None, None)`. Помещает SECOND и результат вызова в стек.521522**`WITH_CLEANUP_FINISH`**523524Извлекает из стека тип исключения и результат вызова функции ‘exit’.525526Если в стеке представлено исключение *и* вызов функции возвращает ‘истина’, эта информация «обнуляется» и заменяется одним `WHY_SILENCED`, чтобы предотвратить повторное возбуждение исключения [`END_FINALLY`](https://python-all.ru/3.6/library/dis.html#opcode-END_FINALLY). (Но нелокальные переходы всё равно будут возобновлены.)527528Все следующие опкоды используют свои аргументы.529530**`STORE_NAME`(*namei*)**531532Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор пытается использовать [`STORE_FAST`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_GLOBAL), если это возможно.533534**`DELETE_NAME`(*namei*)**535536Реализует `del name`, где *namei* – это индекс в атрибут `co_names` объекта кода.537538**`UNPACK_SEQUENCE`(*count*)**539540Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.541542**`UNPACK_EX`(*counts*)**543544Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.545546Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.547548**`STORE_ATTR`(*namei*)**549550Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.551552**`DELETE_ATTR`(*namei*)**553554Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.555556**`STORE_GLOBAL`(*namei*)**557558Работает как [`STORE_NAME`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.559560**`DELETE_GLOBAL`(*namei*)**561562Работает как [`DELETE_NAME`](https://python-all.ru/3.6/library/dis.html#opcode-DELETE_NAME), но удаляет глобальное имя.563564**`LOAD_CONST`(*consti*)**565566Помещает `co_consts[consti]` в стек.567568**`LOAD_NAME`(*namei*)**569570Помещает значение, связанное с `co_names[namei]`, в стек.571572**`BUILD_TUPLE`(*count*)**573574Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.575576**`BUILD_LIST`(*count*)**577578Работает как [`BUILD_TUPLE`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.579580**`BUILD_SET`(*count*)**581582Работает как [`BUILD_TUPLE`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.583584**`BUILD_MAP`(*count*)**585586Помещает новый объект словаря в стек. Извлекает `2 * count` элементов так, чтобы словарь содержал *count* записей: `{..., TOS3: TOS2, TOS1: TOS}`.587588Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для *count* элементов.589590**`BUILD_CONST_KEY_MAP`(*count*)**591592Версия [`BUILD_MAP`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_MAP), оптимизированная для константных ключей. Значения *count* извлекаются из стека. Верхний элемент стека содержит кортеж ключей.593594Новое в версии 3.6.595596**`BUILD_STRING`(*count*)**597598Конкатенирует *count* строк из стека и помещает результирующую строку в стек.599600Новое в версии 3.6.601602**`BUILD_TUPLE_UNPACK`(*count*)**603604Извлекает *count* итерируемых объектов из стека, объединяет их в один кортеж, и помещает результат. Реализует распаковку итерируемого объекта в кортежных литералах `(*x, *y, *z)`.605606Новое в версии 3.5.607608**`BUILD_TUPLE_UNPACK_WITH_CALL`(*count*)**609610Это похоже на [`BUILD_TUPLE_UNPACK`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE_UNPACK), но используется для синтаксиса вызова `f(*x, *y, *z)`. Элемент стека на позиции `count + 1` должен быть соответствующим вызываемым объектом `f`.611612Новое в версии 3.6.613614**`BUILD_LIST_UNPACK`(*count*)**615616Это похоже на [`BUILD_TUPLE_UNPACK`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE_UNPACK), но помещает список, а не кортеж. Реализует распаковку итерируемого объекта в списковых литералах `[*x, *y, *z]`.617618Новое в версии 3.5.619620**`BUILD_SET_UNPACK`(*count*)**621622Это похоже на [`BUILD_TUPLE_UNPACK`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE_UNPACK), но помещает множество, а не кортеж. Реализует распаковку итерируемого объекта в множественных литералах `{*x, *y, *z}`.623624Новое в версии 3.5.625626**`BUILD_MAP_UNPACK`(*count*)**627628Извлекает *count* отображений из стека, объединяет их в один словарь и помещает результат. Реализует распаковку словаря в словарных литералах `{**x, **y, **z}`.629630Новое в версии 3.5.631632**`BUILD_MAP_UNPACK_WITH_CALL`(*count*)**633634Это похоже на [`BUILD_MAP_UNPACK`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_MAP_UNPACK), но используется для синтаксиса вызова `f(**x, **y, **z)`. Элемент стека на позиции `count + 2` должен быть соответствующим вызываемым объектом `f`.635636Новое в версии 3.5.637638Изменено в версии 3.6: Позиция вызываемого объекта определяется прибавлением 2 к аргументу кода операции, а не кодированием её во втором байте аргумента.639640**`LOAD_ATTR`(*namei*)**641642Заменяет TOS на `getattr(TOS, co_names[namei])`.643644**`COMPARE_OP`(*opname*)**645646Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname]`.647648**`IMPORT_NAME`(*namei*)**649650Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и передаются в качестве аргументов *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.6/library/functions.html#__import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкция [`STORE_FAST`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.651652**`IMPORT_FROM`(*namei*)**653654Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.6/library/dis.html#opcode-STORE_FAST).655656**`JUMP_FORWARD`(*delta*)**657658Увеличивает счётчик байт-кода на *delta*.659660**`POP_JUMP_IF_TRUE`(*target*)**661662Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.663664Новое в версии 3.1.665666**`POP_JUMP_IF_FALSE`(*target*)**667668Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.669670Новое в версии 3.1.671672**`JUMP_IF_TRUE_OR_POP`(*target*)**673674Если TOS истинно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.675676Новое в версии 3.1.677678**`JUMP_IF_FALSE_OR_POP`(*target*)**679680Если TOS ложно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.681682Новое в версии 3.1.683684**`JUMP_ABSOLUTE`(*target*)**685686Устанавливает счётчик байткода в *target*.687688**`FOR_ITER`(*delta*)**689690TOS – это [итератор](https://python-all.ru/3.6/glossary.html#term-iterator). Вызовите его метод [`__next__()`](https://python-all.ru/3.6/library/stdtypes.html#iterator.__next__). Если он возвращает новое значение, поместите его в стек (итератор остаётся под ним). Если итератор сообщает, что он исчерпан, TOS извлекается из стека, а счётчик байт-кода увеличивается на *delta*.691692**`LOAD_GLOBAL`(*namei*)**693694Загружает глобальную переменную `co_names[namei]` в стек.695696**`SETUP_LOOP`(*delta*)**697698Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер *delta* байт.699700**`SETUP_EXCEPT`(*delta*)**701702Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на первый блок except.703704**`SETUP_FINALLY`(*delta*)**705706Pushes a try block from a try-except clause onto the block stack. *delta* points to the finally block.707708**`LOAD_FAST`(*var\_num*)**709710Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.711712**`STORE_FAST`(*var\_num*)**713714Сохраняет TOS в локальную переменную `co_varnames[var_num]`.715716**`DELETE_FAST`(*var\_num*)**717718Удаляет локальную переменную `co_varnames[var_num]`.719720**`STORE_ANNOTATION`(*namei*)**721722Сохраняет TOS как `locals()['__annotations__'][co_names[namei]] = TOS`.723724Новое в версии 3.6.725726**`LOAD_CLOSURE`(*i*)**727728Помещает ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае – `co_freevars[i - len(co_cellvars)]`.729730**`LOAD_DEREF`(*i*)**731732Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.733734**`LOAD_CLASSDEREF`(*i*)**735736Похожа на [`LOAD_DEREF`](https://python-all.ru/3.6/library/dis.html#opcode-LOAD_DEREF), но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.737738Новое в версии 3.4.739740**`STORE_DEREF`(*i*)**741742Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.743744**`DELETE_DEREF`(*i*)**745746Очищает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Используется оператором [`del`](https://python-all.ru/3.6/reference/simple_stmts.html#del).747748Новое в версии 3.2.749750**`RAISE_VARARGS`(*argc*)**751752Вызывает исключение. *argc* указывает количество аргументов инструкции raise, от 0 до 3. Обработчик находит traceback как TOS2, параметр как TOS1, а исключение как TOS.753754**`CALL_FUNCTION`(*argc*)**755756Вызывает вызываемый объект с позиционными аргументами. *argc* указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы, причём самый правый аргумент находится на вершине. Под аргументами находится вызываемый объект. `CALL_FUNCTION` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.757758Изменено в версии 3.6: Эта инструкция используется только для вызовов с позиционными аргументами.759760**`CALL_FUNCTION_KW`(*argc*)**761762Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. *argc* указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж имён именованных аргументов. Под ним находятся именованные аргументы в порядке, соответствующем кортежу. Под ними – позиционные аргументы, причём самый правый параметр – наверху. Под аргументами находится вызываемый объект. `CALL_FUNCTION_KW` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, обратно в стек.763764Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, *argc* указывает общее количество аргументов.765766**`CALL_FUNCTION_EX`(*flags*)**767768Вызывает вызываемый объект с переменным набором позиционных и именованных аргументов. Если установлен младший бит *flags*, верхний элемент стека содержит объект отображения (mapping) с дополнительными именованными аргументами. Под ним находится итерируемый объект, содержащий позиционные аргументы и вызываемый объект. [`BUILD_MAP_UNPACK_WITH_CALL`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_MAP_UNPACK_WITH_CALL) и [`BUILD_TUPLE_UNPACK_WITH_CALL`](https://python-all.ru/3.6/library/dis.html#opcode-BUILD_TUPLE_UNPACK_WITH_CALL) можно использовать для объединения нескольких объектов отображения и итерируемых объектов с аргументами. Перед вызовом вызываемого объекта объект отображения и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. `CALL_FUNCTION_EX` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, обратно в стек.769770Новое в версии 3.6.771772**`MAKE_FUNCTION`(*argc*)**773774Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.775776- `0x01` кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке777- `0x02` словарь значений по умолчанию только-именованных параметров778- `0x04` словарь аннотаций779- `0x08` кортеж, содержащий ячейки для свободных переменных, образующий замыкание780- код, связанный с функцией (на TOS1)781- [полное имя](https://python-all.ru/3.6/glossary.html#term-qualified-name) функции (на TOS)782783**`BUILD_SLICE`(*argc*)**784785Помещает объект среза в стек. *argc* должен быть 2 или 3. Если равно 2, помещается `slice(TOS1, TOS)`; если 3, помещается `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.6/library/functions.html#slice).786787**`EXTENDED_ARG`(*ext*)**788789Добавляет префикс к любой опкоду, чей аргумент слишком велик, чтобы поместиться в стандартные два байта. *ext* содержит два дополнительных байта, которые вместе с аргументом последующего опкода образуют четырёхбайтовый аргумент, причём *ext* является двумя старшими байтами.790791**`FORMAT_VALUE`(*flags*)**792793Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную *спецификацию формата*, затем обязательное *значение*. *Флаги* интерпретируются следующим образом:794795- `(flags & 0x03) == 0x00`: *значение* форматируется как есть.796- `(flags & 0x03) == 0x01`: извлечь [спецификацию формата](https://python-all.ru/3.6/library/stdtypes.html#str) из стека и использовать её, иначе использовать пустую *спецификацию формата*.797- `(flags & 0x03) == 0x02`: извлечь [спецификацию формата](https://python-all.ru/3.6/library/functions.html#repr) из стека и использовать её, иначе использовать пустую *спецификацию формата*.798- `(flags & 0x03) == 0x03`: извлечь [спецификацию формата](https://python-all.ru/3.6/library/functions.html#ascii) из стека и использовать её, иначе использовать пустую *спецификацию формата*.799- `(flags & 0x04) == 0x04`: извлечь *fmt\_spec* из стека и использовать его, иначе использовать пустой *fmt\_spec*.800801Форматирование выполняется с помощью `PyObject_Format()`. Результат помещается в стек.802803Новое в версии 3.6.804805**`HAVE_ARGUMENT`**806807Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно `< HAVE_ARGUMENT` и `>= HAVE_ARGUMENT`).808809Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды `< HAVE_ARGUMENT` игнорируют его. Раньше аргумент был только у опкодов `>= HAVE_ARGUMENT`.810811## 32.12.4. Коллекции опкодов812813Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:814815#### `dis.opname`816817Последовательность имён операций, индексируемая с помощью байткода.818819#### `dis.opmap`820821Словарь, сопоставляющий имена операций с байткодами.822823#### `dis.cmp_op`824825Последовательность всех имён операций сравнения.826827#### `dis.hasconst`828829Последовательность байткодов, обращающихся к константе.830831#### `dis.hasfree`832833Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она *не* включает ссылки на глобальные или встроенные области видимости).834835#### `dis.hasname`836837Последовательность байткодов, обращающихся к атрибуту по имени.838839#### `dis.hasjrel`840841Последовательность байткодов, имеющих относительную цель перехода.842843#### `dis.hasjabs`844845Последовательность байткодов, имеющих абсолютную цель перехода.846847#### `dis.haslocal`848849Последовательность байткодов, обращающихся к локальной переменной.850851#### `dis.hascompare`852853Последовательность байткодов логических операций.854