dis.md
1> **Источник:** https://python-all.ru/3.5/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.5/library/dis.html#module-dis) – Дизассемблер байткода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.5/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.5/library/dis.html#module-dis) поддерживает анализ [байт-кода](https://python-all.ru/3.5/glossary.html#term-bytecode) CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.1617Пример: Дана функция `myfunc()`:1819```python20def myfunc(alist):21 return len(alist)22```2324следующую команду можно использовать для отображения дизассемблирования `myfunc()`:2526```python27>>> dis.dis(myfunc)28 2 0 LOAD_GLOBAL 0 (len)29 3 LOAD_FAST 0 (alist)30 6 CALL_FUNCTION 131 9 RETURN_VALUE32```3334(«2» – это номер строки).3536## 32.12.1. Анализ байткода3738Новое в версии 3.4.3940API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.5/library/dis.html#dis.Bytecode), который предоставляет удобный доступ к деталям скомпилированного кода.4142#### `class dis.Bytecode(x, *, first_line=None, current_offset=None)`4344Анализирует байт-код, соответствующий функции, генератору, методу, строке\\nисходного кода или объекту кода (возвращаемому [`compile()`](https://python-all.ru/3.5/library/functions.html#compile)).4546Это удобная обёртка над многими функциями, перечисленными ниже, особенно [`get_instructions()`](https://python-all.ru/3.5/library/dis.html#dis.get_instructions), поскольку итерация по экземпляру [`Bytecode`](https://python-all.ru/3.5/library/dis.html#dis.Bytecode) возвращает операции байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.5/library/dis.html#dis.Instruction).4748Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.4950Если *current\_offset* не равно `None`, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что [`dis()`](https://python-all.ru/3.5/library/dis.html#dis.Bytecode.dis) будет отображать маркер «текущая инструкция» напротив указанной операции.5152#### `classmethod from_traceback(tb)`5354Создаёт экземпляр [`Bytecode`](https://python-all.ru/3.5/library/dis.html#dis.Bytecode) из заданного traceback, устанавливая *current\_offset* на инструкцию, ответственную за исключение.5556#### `codeobj`5758Скомпилированный объект кода.5960#### `first_line`6162Первая строка исходного кода объекта кода (если доступна)6364#### `dis()`6566Возвращает форматированное представление операций байткода (то же, что выводится [`dis.dis()`](https://python-all.ru/3.5/library/dis.html#dis.dis), но возвращается в виде многострочной строки).6768#### `info()`6970Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.5/library/dis.html#dis.code_info).7172Пример:7374```python75>>> bytecode = dis.Bytecode(myfunc)76>>> for instr in bytecode:77... print(instr.opname)78...79LOAD_GLOBAL80LOAD_FAST81CALL_FUNCTION82RETURN_VALUE83```8485## 32.12.2. Функции анализа8687Модуль [`dis`](https://python-all.ru/3.5/library/dis.html#module-dis) также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:8889#### `dis.code_info(x)`9091Возвращает форматированную многострочную строку с подробной информацией об объекте кода\\nдля указанной функции, генератора, метода, строки исходного кода или объекта кода.9293Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.9495Новое в версии 3.2.9697#### `dis.show_code(x, *, file=None)`9899Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или `sys.stdout`, если *file* не указан).100101Это удобная краткая форма для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.102103Новое в версии 3.2.104105Изменено в версии 3.4: Добавлен параметр *file*.106107#### `dis.dis(x=None, *, file=None)`108109Дизассемблирует объект *x*. *x* может обозначать модуль, класс, метод, функцию, генератор, объект кода, строку исходного кода или\\nпоследовательность байтов исходного байт-кода. Для модуля дизассемблируются все функции.\\nДля класса дизассемблируются все методы (включая методы класса и статические методы).\\nДля объекта кода или последовательности байтов исходного байт-кода выводится по одной строке на каждую\\nинструкцию байт-кода. Строки сначала компилируются в объекты кода с помощью [`compile()`](https://python-all.ru/3.5/library/functions.html#compile)\\nвстроенной функции, а затем дизассемблируются. Если объект не указан, эта\\nфункция дизассемблирует последнюю трассировку.110111Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.112113Изменено в версии 3.4: Добавлен параметр *file*.114115#### `dis.distb(tb=None, *, file=None)`116117Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.118119Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.120121Изменено в версии 3.4: Добавлен параметр *file*.122123#### `dis.disassemble(code, lasti=-1, *, file=None)`124125#### `dis.disco(code, lasti=-1, *, file=None)`126127Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:1281291. номер строки для первой инструкции каждой строки1302. текущая инструкция, помечена как `-->`,1313. инструкция с меткой, помечена `>>`,1324. адрес инструкции,1335. название кода операции,1346. параметры операции и1357. интерпретация параметров в скобках.136137Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.138139Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.140141Изменено в версии 3.4: Добавлен параметр *file*.142143#### `dis.get_instructions(x, *, first_line=None)`144145Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.146147Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.5/library/dis.html#dis.Instruction), содержащих сведения о каждой операции в переданном коде.148149Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.150151Новое в версии 3.4.152153#### `dis.findlinestarts(code)`154155Эта функция-генератор использует атрибуты `co_firstlineno` и `co_lnotab` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они возвращаются в виде пар `(offset, lineno)`.156157#### `dis.findlabels(code)`158159Определяет все смещения в объекте кода *code*, которые являются целями перехода, и\\nвозвращает список этих смещений.160161#### `dis.stack_effect(opcode[, oparg])`162163Вычисляет эффект стека для *opcode* с аргументом *oparg*.164165Новое в версии 3.4.166167## 32.12.3. Инструкции байткода Python168169Функция [`get_instructions()`](https://python-all.ru/3.5/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.5/library/dis.html#dis.Bytecode) предоставляют сведения об инструкциях байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.5/library/dis.html#dis.Instruction):170171#### `class dis.Instruction`172173Подробности об операции байткода174175#### `opcode`176177Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [коллекциях Opcode](https://python-all.ru/3.5/library/dis.html#opcode-collections).178179#### `opname`180181Человекочитаемое имя операции182183#### `arg`184185числовой аргумент операции (если есть), иначе `None`186187#### `argval`188189разрешённое значение аргумента (если известно), иначе то же, что и arg190191#### `argrepr`192193человекочитаемое описание аргумента операции194195#### `offset`196197начальный индекс операции в последовательности байт-кода198199#### `starts_line`200201Строка, с которой начинается данный опкод (если есть), иначе `None`.202203#### `is_jump_target`204205`True`, если другой код переходит сюда, иначе `False`206207Новое в версии 3.4.208209В настоящее время компилятор Python генерирует следующие инструкции байткода.210211**Общие инструкции**212213**`NOP`**214215Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.216217**`POP_TOP`**218219Удаляет элемент с вершины стека (TOS).220221**`ROT_TWO`**222223Меняет местами два верхних элемента стека.224225**`ROT_THREE`**226227Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.228229**`DUP_TOP`**230231Дублирует ссылку на вершине стека.232233**`DUP_TOP_TWO`**234235Дублирует две ссылки на вершине стека, сохраняя их порядок.236237**Унарные операции**238239Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.240241**`UNARY_POSITIVE`**242243Реализует `TOS = +TOS`.244245**`UNARY_NEGATIVE`**246247Реализует `TOS = -TOS`.248249**`UNARY_NOT`**250251Реализует `TOS = not TOS`.252253**`UNARY_INVERT`**254255Реализует `TOS = ~TOS`.256257**`GET_ITER`**258259Реализует `TOS = iter(TOS)`.260261**`GET_YIELD_FROM_ITER`**262263Если `TOS` является объектом [генераторный итератор](https://python-all.ru/3.5/glossary.html#term-generator-iterator) или [корутина](https://python-all.ru/3.5/glossary.html#term-coroutine), он остаётся без изменений. В противном случае реализует `TOS = iter(TOS)`.264265Новое в версии 3.5.266267**Бинарные операции**268269Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.270271**`BINARY_POWER`**272273Реализует `TOS = TOS1 ** TOS`.274275**`BINARY_MULTIPLY`**276277Реализует `TOS = TOS1 * TOS`.278279**`BINARY_MATRIX_MULTIPLY`**280281Реализует `TOS = TOS1 @ TOS`.282283Новое в версии 3.5.284285**`BINARY_FLOOR_DIVIDE`**286287Реализует `TOS = TOS1 // TOS`.288289**`BINARY_TRUE_DIVIDE`**290291Реализует `TOS = TOS1 / TOS`.292293**`BINARY_MODULO`**294295Реализует `TOS = TOS1 % TOS`.296297**`BINARY_ADD`**298299Реализует `TOS = TOS1 + TOS`.300301**`BINARY_SUBTRACT`**302303Реализует `TOS = TOS1 - TOS`.304305**`BINARY_SUBSCR`**306307Реализует `TOS = TOS1[TOS]`.308309**`BINARY_LSHIFT`**310311Реализует `TOS = TOS1 << TOS`.312313**`BINARY_RSHIFT`**314315Реализует `TOS = TOS1 >> TOS`.316317**`BINARY_AND`**318319Реализует `TOS = TOS1 & TOS`.320321**`BINARY_XOR`**322323Реализует `TOS = TOS1 ^ TOS`.324325**`BINARY_OR`**326327Реализует `TOS = TOS1 | TOS`.328329**Операции на месте**330331Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.332333**`INPLACE_POWER`**334335Реализует операцию на месте `TOS = TOS1 ** TOS`.336337**`INPLACE_MULTIPLY`**338339Реализует операцию на месте `TOS = TOS1 * TOS`.340341**`INPLACE_MATRIX_MULTIPLY`**342343Реализует операцию на месте `TOS = TOS1 @ TOS`.344345Новое в версии 3.5.346347**`INPLACE_FLOOR_DIVIDE`**348349Реализует операцию на месте `TOS = TOS1 // TOS`.350351**`INPLACE_TRUE_DIVIDE`**352353Реализует операцию на месте `TOS = TOS1 / TOS`.354355**`INPLACE_MODULO`**356357Реализует операцию на месте `TOS = TOS1 % TOS`.358359**`INPLACE_ADD`**360361Реализует операцию на месте `TOS = TOS1 + TOS`.362363**`INPLACE_SUBTRACT`**364365Реализует операцию на месте `TOS = TOS1 - TOS`.366367**`INPLACE_LSHIFT`**368369Реализует операцию на месте `TOS = TOS1 << TOS`.370371**`INPLACE_RSHIFT`**372373Реализует операцию на месте `TOS = TOS1 >> TOS`.374375**`INPLACE_AND`**376377Реализует операцию на месте `TOS = TOS1 & TOS`.378379**`INPLACE_XOR`**380381Реализует операцию на месте `TOS = TOS1 ^ TOS`.382383**`INPLACE_OR`**384385Реализует операцию на месте `TOS = TOS1 | TOS`.386387**`STORE_SUBSCR`**388389Реализует `TOS1[TOS] = TOS2`.390391**`DELETE_SUBSCR`**392393Реализует `del TOS1[TOS]`.394395**Коды операций корутин**396397**`GET_AWAITABLE`**398399Реализует `TOS = get_awaitable(TOS)`, где `get_awaitable(o)` возвращает `o`, если `o` является объектом корутины или объектом генератора с флагом CO\_ITERABLE\_COROUTINE, или разрешает `o.__await__`.400401**`GET_AITER`**402403Реализует `TOS = get_awaitable(TOS.__aiter__())`. Подробнее о `get_awaitable` см. в `GET_AWAITABLE`.404405**`GET_ANEXT`**406407Реализует `PUSH(get_awaitable(TOS.__anext__()))`. Подробнее о `get_awaitable` см. в `GET_AWAITABLE`.408409**`BEFORE_ASYNC_WITH`**410411Извлекает `__aenter__` и `__aexit__` из объекта на вершине стека. Помещает `__aexit__` и результат `__aenter__()` в стек.412413**`SETUP_ASYNC_WITH`**414415Создаёт новый объект фрейма.416417**Прочие опкоды**418419**`PRINT_EXPR`**420421Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью [`POP_TOP`](https://python-all.ru/3.5/library/dis.html#opcode-POP_TOP).422423**`BREAK_LOOP`**424425Завершает цикл при выполнении оператора [`break`](https://python-all.ru/3.5/reference/simple_stmts.html#break).426427**`CONTINUE_LOOP`(*target*)**428429Продолжает цикл при выполнении оператора [`continue`](https://python-all.ru/3.5/reference/simple_stmts.html#continue). *target* – это адрес, на который нужно перейти (должен быть инструкция [`FOR_ITER`](https://python-all.ru/3.5/library/dis.html#opcode-FOR_ITER)).430431**`SET_ADD`(*i*)**432433Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).434435**`LIST_APPEND`(*i*)**436437Вызывает `list.append(TOS[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).438439**`MAP_ADD`(*i*)**440441Вызывает `dict.setitem(TOS1[-i], TOS, TOS1)`. Используется для реализации словарных включений (dict comprehensions).442443Для всех инструкций [`SET_ADD`](https://python-all.ru/3.5/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.5/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.5/library/dis.html#opcode-MAP_ADD), когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.444445**`RETURN_VALUE`**446447Возвращает TOS вызывающей стороне функции.448449**`YIELD_VALUE`**450451Извлекает TOS и возвращает его из [генератора](https://python-all.ru/3.5/glossary.html#term-generator).452453**`YIELD_FROM`**454455Извлекает TOS и делегирует ему как под-итератор от [генератора](https://python-all.ru/3.5/glossary.html#term-generator).456457Новое в версии 3.3.458459**`IMPORT_STAR`**460461Загружает все имена, не начинающиеся с `'_'`, из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует `from module import *`.462463**`POP_BLOCK`**464465Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, представляющий вложенные циклы, операторы try и т.п.466467**`POP_EXCEPT`**468469Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.470471**`END_FINALLY`**472473Завершает предложение [`finally`](https://python-all.ru/3.5/reference/compound_stmts.html#finally). Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращает значение, и продолжает со следующим внешним блоком.474475**`LOAD_BUILD_CLASS`**476477Помещает `builtins.__build_class__()` в стек. Позже он вызывается [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION) для создания класса.478479**`SETUP_WITH`(*delta*)**480481Эта инструкция выполняет несколько операций перед началом блока with. Во-первых, она загружает [`__exit__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__exit__) из менеджера контекста и помещает его в стек для последующего использования `WITH_CLEANUP`. Затем вызывается [`__enter__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__enter__), и в стек помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода enter помещается в стек. Следующая инструкция либо игнорирует его ([`POP_TOP`](https://python-all.ru/3.5/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную(ые) ([`STORE_FAST`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/3.5/library/dis.html#opcode-UNPACK_SEQUENCE)).482483**`WITH_CLEANUP_START`**484485Очищает стек при выходе из блока оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with). TOS – это привязанный метод [`__exit__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__exit__) менеджера контекста. Под TOS находятся 1–3 значения, показывающие, как/почему был выполнен блок finally:486487- SECOND = `None`488- (SECOND, THIRD) = (`WHY_{RETURN,CONTINUE}`), retval489- SECOND = `WHY_*`; ниже нет retval490- (SECOND, THIRD, FOURTH) = exc\_info()491492В последнем случае вызывается `TOS(SECOND, THIRD, FOURTH)`, иначе `TOS(None, None, None)`. Помещает SECOND и результат вызова в стек.493494**`WITH_CLEANUP_FINISH`**495496Извлекает из стека тип исключения и результат вызова функции ‘exit’.497498Если в стеке представлено исключение *и* вызов функции возвращает ‘истина’, эта информация «обнуляется» и заменяется одним `WHY_SILENCED`, чтобы предотвратить повторное возбуждение исключения [`END_FINALLY`](https://python-all.ru/3.5/library/dis.html#opcode-END_FINALLY). (Но нелокальные переходы всё равно будут возобновлены.)499500Все следующие опкоды требуют аргументов. Аргумент занимает два байта, причём старший байт идёт последним.501502**`STORE_NAME`(*namei*)**503504Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор пытается использовать [`STORE_FAST`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_GLOBAL), если это возможно.505506**`DELETE_NAME`(*namei*)**507508Реализует `del name`, где *namei* – это индекс в атрибут `co_names` объекта кода.509510**`UNPACK_SEQUENCE`(*count*)**511512Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.513514**`UNPACK_EX`(*counts*)**515516Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.517518Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.519520**`STORE_ATTR`(*namei*)**521522Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.523524**`DELETE_ATTR`(*namei*)**525526Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.527528**`STORE_GLOBAL`(*namei*)**529530Работает как [`STORE_NAME`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.531532**`DELETE_GLOBAL`(*namei*)**533534Работает как [`DELETE_NAME`](https://python-all.ru/3.5/library/dis.html#opcode-DELETE_NAME), но удаляет глобальное имя.535536**`LOAD_CONST`(*consti*)**537538Помещает `co_consts[consti]` в стек.539540**`LOAD_NAME`(*namei*)**541542Помещает значение, связанное с `co_names[namei]`, в стек.543544**`BUILD_TUPLE`(*count*)**545546Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.547548**`BUILD_LIST`(*count*)**549550Работает как [`BUILD_TUPLE`](https://python-all.ru/3.5/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.551552**`BUILD_SET`(*count*)**553554Работает как [`BUILD_TUPLE`](https://python-all.ru/3.5/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.555556**`BUILD_MAP`(*count*)**557558Помещает новый объект словаря в стек. Извлекает `2 * count` элементов так, чтобы словарь содержал *count* записей: `{..., TOS3: TOS2, TOS1: TOS}`.559560Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для *count* элементов.561562**`BUILD_TUPLE_UNPACK`(*count*)**563564Извлекает *count* итерируемых объектов из стека, объединяет их в один кортеж, и помещает результат. Реализует распаковку итерируемого объекта в кортежных литералах `(*x, *y, *z)`.565566Новое в версии 3.5.567568**`BUILD_LIST_UNPACK`(*count*)**569570Это похоже на [`BUILD_TUPLE_UNPACK`](https://python-all.ru/3.5/library/dis.html#opcode-BUILD_TUPLE_UNPACK), но помещает список, а не кортеж. Реализует распаковку итерируемого объекта в списковых литералах `[*x, *y, *z]`.571572Новое в версии 3.5.573574**`BUILD_SET_UNPACK`(*count*)**575576Это похоже на [`BUILD_TUPLE_UNPACK`](https://python-all.ru/3.5/library/dis.html#opcode-BUILD_TUPLE_UNPACK), но помещает множество, а не кортеж. Реализует распаковку итерируемого объекта в множественных литералах `{*x, *y, *z}`.577578Новое в версии 3.5.579580**`BUILD_MAP_UNPACK`(*count*)**581582Извлекает *count* отображений из стека, объединяет их в один словарь и помещает результат. Реализует распаковку словаря в словарных литералах `{**x, **y, **z}`.583584Новое в версии 3.5.585586**`BUILD_MAP_UNPACK_WITH_CALL`(*oparg*)**587588Это похоже на [`BUILD_MAP_UNPACK`](https://python-all.ru/3.5/library/dis.html#opcode-BUILD_MAP_UNPACK), но используется для синтаксиса вызова `f(**x, **y, **z)`. Младший байт *oparg* содержит количество отображений, относительная позиция соответствующего вызываемого объекта `f` закодирована во втором байте *oparg*.589590Новое в версии 3.5.591592**`LOAD_ATTR`(*namei*)**593594Заменяет TOS на `getattr(TOS, co_names[namei])`.595596**`COMPARE_OP`(*opname*)**597598Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname]`.599600**`IMPORT_NAME`(*namei*)**601602Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и передаются в качестве аргументов *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.5/library/functions.html#__import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкция [`STORE_FAST`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.603604**`IMPORT_FROM`(*namei*)**605606Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.5/library/dis.html#opcode-STORE_FAST).607608**`JUMP_FORWARD`(*delta*)**609610Увеличивает счётчик байт-кода на *delta*.611612**`POP_JUMP_IF_TRUE`(*target*)**613614Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.615616**`POP_JUMP_IF_FALSE`(*target*)**617618Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.619620**`JUMP_IF_TRUE_OR_POP`(*target*)**621622Если TOS истинно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.623624**`JUMP_IF_FALSE_OR_POP`(*target*)**625626Если TOS ложно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.627628**`JUMP_ABSOLUTE`(*target*)**629630Устанавливает счётчик байткода в *target*.631632**`FOR_ITER`(*delta*)**633634TOS – это [итератор](https://python-all.ru/3.5/glossary.html#term-iterator). Вызовите его метод [`__next__()`](https://python-all.ru/3.5/library/stdtypes.html#iterator.__next__). Если он возвращает новое значение, поместите его в стек (итератор остаётся под ним). Если итератор сообщает, что он исчерпан, TOS извлекается из стека, а счётчик байт-кода увеличивается на *delta*.635636**`LOAD_GLOBAL`(*namei*)**637638Загружает глобальную переменную `co_names[namei]` в стек.639640**`SETUP_LOOP`(*delta*)**641642Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер *delta* байт.643644**`SETUP_EXCEPT`(*delta*)**645646Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на первый блок except.647648**`SETUP_FINALLY`(*delta*)**649650Pushes a try block from a try-except clause onto the block stack. *delta* points to the finally block.651652**`LOAD_FAST`(*var\_num*)**653654Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.655656**`STORE_FAST`(*var\_num*)**657658Сохраняет TOS в локальную переменную `co_varnames[var_num]`.659660**`DELETE_FAST`(*var\_num*)**661662Удаляет локальную переменную `co_varnames[var_num]`.663664**`LOAD_CLOSURE`(*i*)**665666Помещает ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае – `co_freevars[i - len(co_cellvars)]`.667668**`LOAD_DEREF`(*i*)**669670Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.671672**`LOAD_CLASSDEREF`(*i*)**673674Похожа на [`LOAD_DEREF`](https://python-all.ru/3.5/library/dis.html#opcode-LOAD_DEREF), но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.675676**`STORE_DEREF`(*i*)**677678Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.679680**`DELETE_DEREF`(*i*)**681682Очищает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Используется оператором [`del`](https://python-all.ru/3.5/reference/simple_stmts.html#del).683684**`RAISE_VARARGS`(*argc*)**685686Вызывает исключение. *argc* указывает количество аргументов инструкции raise, от 0 до 3. Обработчик находит traceback как TOS2, параметр как TOS1, а исключение как TOS.687688**`CALL_FUNCTION`(*argc*)**689690Вызывает вызываемый объект. Младший байт *argc* указывает количество позиционных аргументов, старший байт – количество именованных аргументов. Стек содержит именованные аргументы сверху (если есть), затем позиционные аргументы под ними (если есть), затем вызываемый объект под ними. Каждый именованный аргумент представлен двумя значениями в стеке: имя аргумента и его значение, при этом значение аргумента находится выше имени в стеке. Позиционные аргументы помещаются в стек в порядке передачи вызываемому объекту, причём самый правый позиционный аргумент – сверху. `CALL_FUNCTION` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом.691692**`MAKE_FUNCTION`(*argc*)**693694Помещает новый объект функции в стек. Снизу вверх, используемый стек должен состоять из695696- `argc & 0xFF` объекты аргументов по умолчанию в позиционном порядке для позиционных параметров697- `(argc >> 8) & 0xFF` пары имени и аргумента по умолчанию, где имя находится сразу под объектом на стеке, для параметров только по ключевым словам698- `(argc >> 16) & 0x7FFF` объекты аннотаций параметров699- кортеж, перечисляющий имена параметров для аннотаций (только если есть какие-либо объекты аннотаций)700- код, связанный с функцией (на TOS1)701- [полное имя](https://python-all.ru/3.5/glossary.html#term-qualified-name) функции (на TOS)702703**`MAKE_CLOSURE`(*argc*)**704705Создаёт новый объект функции, устанавливает его слот *\_\_closure\_\_* и помещает его на стек. TOS – это [квалифицированное имя](https://python-all.ru/3.5/glossary.html#term-qualified-name) функции, TOS1 – это код, связанный с функцией, а TOS2 – кортеж, содержащий ячейки для свободных переменных замыкания. *argc* интерпретируется как в `MAKE_FUNCTION`; аннотации и значения по умолчанию также находятся в том же порядке под TOS2.706707**`BUILD_SLICE`(*argc*)**708709Помещает объект среза в стек. *argc* должен быть 2 или 3. Если равно 2, помещается `slice(TOS1, TOS)`; если 3, помещается `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.5/library/functions.html#slice).710711**`EXTENDED_ARG`(*ext*)**712713Добавляет префикс к любой опкоду, чей аргумент слишком велик, чтобы поместиться в стандартные два байта. *ext* содержит два дополнительных байта, которые вместе с аргументом последующего опкода образуют четырёхбайтовый аргумент, причём *ext* является двумя старшими байтами.714715**`CALL_FUNCTION_VAR`(*argc*)**716717Вызывает вызываемый объект, аналогично [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). *argc* представляет количество ключевых и позиционных аргументов, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находятся ключевые аргументы (если есть), хранящиеся так же, как в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). Под ними находится итерируемый объект, содержащий дополнительные позиционные аргументы. Под ним – позиционные аргументы (если есть) и вызываемый объект, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта итерируемый объект «распаковывается», и его содержимое добавляется к переданным позиционным аргументам. Итерируемый объект игнорируется при вычислении значения `argc`.718719Изменено в версии 3.5: В версиях с 3.0 по 3.4 итерируемый объект находился над ключевыми аргументами; в версии 3.5 он был перемещён под ключевые аргументы.720721**`CALL_FUNCTION_KW`(*argc*)**722723Вызывает вызываемый объект, аналогично [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). *argc* представляет количество ключевых и позиционных аргументов, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находится отображение, содержащее дополнительные ключевые аргументы. Под ним находятся ключевые аргументы (если есть), позиционные аргументы (если есть) и вызываемый объект, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта отображение на вершине стека «распаковывается», и его содержимое добавляется к переданным ключевым аргументам. Отображение на вершине стека игнорируется при вычислении значения `argc`.724725**`CALL_FUNCTION_VAR_KW`(*argc*)**726727Вызывает вызываемый объект, аналогично [`CALL_FUNCTION_VAR`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION_VAR) и [`CALL_FUNCTION_KW`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION_KW). *argc* представляет количество ключевых и позиционных аргументов, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находится отображение, как в [`CALL_FUNCTION_KW`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION_KW). Под ним находятся ключевые аргументы (если есть), хранящиеся так же, как в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). Под ними находится итерируемый объект, содержащий дополнительные позиционные аргументы. Под ним – позиционные аргументы (если есть) и вызываемый объект, как и в [`CALL_FUNCTION`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION). Перед вызовом вызываемого объекта отображение и итерируемый объект «распаковываются», и их содержимое передаётся как ключевые и позиционные аргументы соответственно, как и в [`CALL_FUNCTION_VAR`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION_VAR) и [`CALL_FUNCTION_KW`](https://python-all.ru/3.5/library/dis.html#opcode-CALL_FUNCTION_KW). Отображение и итерируемый объект оба игнорируются при вычислении значения `argc`.728729Изменено в версии 3.5: В версиях с 3.0 по 3.4 итерируемый объект находился над ключевыми аргументами; в версии 3.5 он был перемещён под ключевые аргументы.730731**`HAVE_ARGUMENT`**732733Это не совсем опкод. Он определяет разделительную линию между опкодами, которые не принимают аргументы `< HAVE_ARGUMENT`, и теми, которые принимают `>= HAVE_ARGUMENT`.734735## 32.12.4. Коллекции опкодов736737Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:738739#### `dis.opname`740741Последовательность имён операций, индексируемая с помощью байткода.742743#### `dis.opmap`744745Словарь, сопоставляющий имена операций с байткодами.746747#### `dis.cmp_op`748749Последовательность всех имён операций сравнения.750751#### `dis.hasconst`752753Последовательность байткодов, обращающихся к константе.754755#### `dis.hasfree`756757Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она *не* включает ссылки на глобальные или встроенные области видимости).758759#### `dis.hasname`760761Последовательность байткодов, обращающихся к атрибуту по имени.762763#### `dis.hasjrel`764765Последовательность байткодов, имеющих относительную цель перехода.766767#### `dis.hasjabs`768769Последовательность байткодов, имеющих абсолютную цель перехода.770771#### `dis.haslocal`772773Последовательность байткодов, обращающихся к локальной переменной.774775#### `dis.hascompare`776777Последовательность байткодов логических операций.778