dis.md
1> **Источник:** https://python-all.ru/3.10/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`dis`](https://python-all.ru/3.10/library/dis.html#module-dis) – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.10/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.10/library/dis.html#module-dis) поддерживает анализ [байт-кода](https://python-all.ru/3.10/glossary.html#term-bytecode) CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.1617Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.1819Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.2021Пример: Дана функция `myfunc()`:2223```python24def myfunc(alist):25 return len(alist)26```2728следующую команду можно использовать для отображения дизассемблирования `myfunc()`:2930```python31>>> dis.dis(myfunc)32 2 0 LOAD_GLOBAL 0 (len)33 2 LOAD_FAST 0 (alist)34 4 CALL_FUNCTION 135 6 RETURN_VALUE36```3738(«2» – это номер строки).3940## Анализ байт-кода4142Новое в версии 3.4.4344API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.10/library/dis.html#dis.Bytecode), который предоставляет удобный доступ к деталям скомпилированного кода.4546#### `class dis.Bytecode(x, *, first_line=None, current_offset=None)`4748Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается [`compile()`](https://python-all.ru/3.10/library/functions.html#compile)).4950Это удобная обёртка над многими функциями, перечисленными ниже, особенно [`get_instructions()`](https://python-all.ru/3.10/library/dis.html#dis.get_instructions), поскольку итерация по экземпляру [`Bytecode`](https://python-all.ru/3.10/library/dis.html#dis.Bytecode) возвращает операции байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.10/library/dis.html#dis.Instruction).5152Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.5354Если *current\_offset* не равно `None`, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что [`dis()`](https://python-all.ru/3.10/library/dis.html#dis.Bytecode.dis) будет отображать маркер «текущая инструкция» напротив указанной операции.5556#### `classmethod from_traceback(tb)`5758Создаёт экземпляр [`Bytecode`](https://python-all.ru/3.10/library/dis.html#dis.Bytecode) из заданного traceback, устанавливая *current\_offset* на инструкцию, ответственную за исключение.5960#### `codeobj`6162Скомпилированный объект кода.6364#### `first_line`6566Первая строка исходного кода объекта кода (если доступна)6768#### `dis()`6970Возвращает форматированное представление операций байткода (то же, что выводится [`dis.dis()`](https://python-all.ru/3.10/library/dis.html#dis.dis), но возвращается в виде многострочной строки).7172#### `info()`7374Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.10/library/dis.html#dis.code_info).7576Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.7778Пример:7980```python81>>> bytecode = dis.Bytecode(myfunc)82>>> for instr in bytecode:83... print(instr.opname)84...85LOAD_GLOBAL86LOAD_FAST87CALL_FUNCTION88RETURN_VALUE89```9091## Функции анализа9293Модуль [`dis`](https://python-all.ru/3.10/library/dis.html#module-dis) также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:9495#### `dis.code_info(x)`9697Возвращает форматированную многострочную строку с подробной информацией об объекте кода для указанной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.9899Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.100101Новое в версии 3.2.102103Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.104105#### `dis.show_code(x, *, file=None)`106107Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или `sys.stdout`, если *file* не указан).108109Это удобная краткая форма для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.110111Новое в версии 3.2.112113Изменено в версии 3.4: Добавлен параметр *file*.114115#### `dis.dis(x=None, *, file=None, depth=None)`116117Дизассемблирует объект *x*. *x* может быть модулем, классом, методом, функцией, генератором, асинхронным генератором, корутиной, объектом кода, строкой исходного кода или последовательностью байт сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы (включая методы класса и статические методы). Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Также рекурсивно дизассемблируются вложенные объекты кода (код включений, генераторных выражений и вложенных функций, а также код, используемый для построения вложенных классов). Строки сначала компилируются в объекты кода с помощью встроенной функции [`compile()`](https://python-all.ru/3.10/library/functions.html#compile), а затем дизассемблируются. Если объект не указан, эта функция дизассемблирует последнюю трассировку.118119Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.120121Максимальная глубина рекурсии ограничивается параметром *depth*, если только он не равен `None`. `depth=0` означает отсутствие рекурсии.122123Изменено в версии 3.4: Добавлен параметр *file*.124125Изменено в версии 3.7: Реализовано рекурсивное дисассемблирование и добавлен параметр *depth*.126127Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.128129#### `dis.distb(tb=None, *, file=None)`130131Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.132133Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.134135Изменено в версии 3.4: Добавлен параметр *file*.136137#### `dis.disassemble(code, lasti=- 1, *, file=None)`138139#### `dis.disco(code, lasti=- 1, *, file=None)`140141Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:1421431. номер строки для первой инструкции каждой строки1442. текущая инструкция, помечена как `-->`,1453. инструкция с меткой, помечена `>>`,1464. адрес инструкции,1475. название кода операции,1486. параметры операции и1497. интерпретация параметров в скобках.150151Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.152153Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.154155Изменено в версии 3.4: Добавлен параметр *file*.156157#### `dis.get_instructions(x, *, first_line=None)`158159Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.160161Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.10/library/dis.html#dis.Instruction), содержащих сведения о каждой операции в переданном коде.162163Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.164165Новое в версии 3.4.166167#### `dis.findlinestarts(code)`168169Эта функция-генератор использует метод `co_lines` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются в виде пар `(offset, lineno)`.170171Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.172173Изменено в версии 3.10: Вместо атрибутов `co_firstlineno` и `co_lnotab` объекта кода используется метод [**PEP 626**](https://python-all.ru/3.10/library/dis.html) `co_lines`.174175#### `dis.findlabels(code)`176177Обнаруживает все смещения в сырой скомпилированной строке байткода *code*, которые являются целями переходов, и возвращает список этих смещений.178179#### `dis.stack_effect(opcode, oparg=None, *, jump=None)`180181Вычисляет эффект стека для *opcode* с аргументом *oparg*.182183Если код имеет цель перехода и *jump* равен `True`, [`stack_effect()`](https://python-all.ru/3.10/library/dis.html#dis.stack_effect) возвращает эффект стека при переходе. Если *jump* равен `False`, возвращается эффект стека при отсутствии перехода. А если *jump* равен `None` (по умолчанию), возвращается максимальный эффект стека для обоих случаев.184185Новое в версии 3.4.186187Изменено в версии 3.8: Добавлен параметр *jump*.188189## Инструкции байткода Python190191Функция [`get_instructions()`](https://python-all.ru/3.10/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.10/library/dis.html#dis.Bytecode) предоставляют сведения об инструкциях байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.10/library/dis.html#dis.Instruction):192193#### `class dis.Instruction`194195Подробности об операции байткода196197#### `opcode`198199Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [коллекциях Opcode](https://python-all.ru/3.10/library/dis.html#opcode-collections).200201#### `opname`202203Человекочитаемое имя операции204205#### `arg`206207числовой аргумент операции (если есть), иначе `None`208209#### `argval`210211разрешённое значение аргумента (если известно), иначе то же, что и arg212213#### `argrepr`214215человекочитаемое описание аргумента операции216217#### `offset`218219начальный индекс операции в последовательности байт-кода220221#### `starts_line`222223Строка, с которой начинается данный опкод (если есть), иначе `None`.224225#### `is_jump_target`226227`True`, если другой код переходит сюда, иначе `False`228229Новое в версии 3.4.230231В настоящее время компилятор Python генерирует следующие инструкции байткода.232233**Общие инструкции**234235#### `NOP`236237Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.238239#### `POP_TOP`240241Удаляет элемент с вершины стека (TOS).242243#### `ROT_TWO`244245Меняет местами два верхних элемента стека.246247#### `ROT_THREE`248249Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.250251#### `ROT_FOUR`252253Поднимает второй, третий и четвёртый элементы стека на одну позицию вверх, перемещает верхний вниз на четвёртую позицию.254255Новое в версии 3.8.256257#### `DUP_TOP`258259Дублирует ссылку на вершине стека.260261Новое в версии 3.2.262263#### `DUP_TOP_TWO`264265Дублирует две ссылки на вершине стека, сохраняя их порядок.266267Новое в версии 3.2.268269**Унарные операции**270271Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.272273#### `UNARY_POSITIVE`274275Реализует `TOS = +TOS`.276277#### `UNARY_NEGATIVE`278279Реализует `TOS = -TOS`.280281#### `UNARY_NOT`282283Реализует `TOS = not TOS`.284285#### `UNARY_INVERT`286287Реализует `TOS = ~TOS`.288289#### `GET_ITER`290291Реализует `TOS = iter(TOS)`.292293#### `GET_YIELD_FROM_ITER`294295Если `TOS` является объектом [генераторный итератор](https://python-all.ru/3.10/glossary.html#term-generator-iterator) или [корутина](https://python-all.ru/3.10/glossary.html#term-coroutine), он остаётся без изменений. В противном случае реализует `TOS = iter(TOS)`.296297Новое в версии 3.5.298299**Бинарные операции**300301Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.302303#### `BINARY_POWER`304305Реализует `TOS = TOS1 ** TOS`.306307#### `BINARY_MULTIPLY`308309Реализует `TOS = TOS1 * TOS`.310311#### `BINARY_MATRIX_MULTIPLY`312313Реализует `TOS = TOS1 @ TOS`.314315Новое в версии 3.5.316317#### `BINARY_FLOOR_DIVIDE`318319Реализует `TOS = TOS1 // TOS`.320321#### `BINARY_TRUE_DIVIDE`322323Реализует `TOS = TOS1 / TOS`.324325#### `BINARY_MODULO`326327Реализует `TOS = TOS1 % TOS`.328329#### `BINARY_ADD`330331Реализует `TOS = TOS1 + TOS`.332333#### `BINARY_SUBTRACT`334335Реализует `TOS = TOS1 - TOS`.336337#### `BINARY_SUBSCR`338339Реализует `TOS = TOS1[TOS]`.340341#### `BINARY_LSHIFT`342343Реализует `TOS = TOS1 << TOS`.344345#### `BINARY_RSHIFT`346347Реализует `TOS = TOS1 >> TOS`.348349#### `BINARY_AND`350351Реализует `TOS = TOS1 & TOS`.352353#### `BINARY_XOR`354355Реализует `TOS = TOS1 ^ TOS`.356357#### `BINARY_OR`358359Реализует `TOS = TOS1 | TOS`.360361**Операции на месте**362363Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.364365#### `INPLACE_POWER`366367Реализует операцию на месте `TOS = TOS1 ** TOS`.368369#### `INPLACE_MULTIPLY`370371Реализует операцию на месте `TOS = TOS1 * TOS`.372373#### `INPLACE_MATRIX_MULTIPLY`374375Реализует операцию на месте `TOS = TOS1 @ TOS`.376377Новое в версии 3.5.378379#### `INPLACE_FLOOR_DIVIDE`380381Реализует операцию на месте `TOS = TOS1 // TOS`.382383#### `INPLACE_TRUE_DIVIDE`384385Реализует операцию на месте `TOS = TOS1 / TOS`.386387#### `INPLACE_MODULO`388389Реализует операцию на месте `TOS = TOS1 % TOS`.390391#### `INPLACE_ADD`392393Реализует операцию на месте `TOS = TOS1 + TOS`.394395#### `INPLACE_SUBTRACT`396397Реализует операцию на месте `TOS = TOS1 - TOS`.398399#### `INPLACE_LSHIFT`400401Реализует операцию на месте `TOS = TOS1 << TOS`.402403#### `INPLACE_RSHIFT`404405Реализует операцию на месте `TOS = TOS1 >> TOS`.406407#### `INPLACE_AND`408409Реализует операцию на месте `TOS = TOS1 & TOS`.410411#### `INPLACE_XOR`412413Реализует операцию на месте `TOS = TOS1 ^ TOS`.414415#### `INPLACE_OR`416417Реализует операцию на месте `TOS = TOS1 | TOS`.418419#### `STORE_SUBSCR`420421Реализует `TOS1[TOS] = TOS2`.422423#### `DELETE_SUBSCR`424425Реализует `del TOS1[TOS]`.426427**Коды операций корутин**428429#### `GET_AWAITABLE`430431Реализует `TOS = get_awaitable(TOS)`, где `get_awaitable(o)` возвращает `o`, если `o` является объектом корутины или объектом генератора с флагом CO\_ITERABLE\_COROUTINE, или разрешает `o.__await__`.432433Новое в версии 3.5.434435#### `GET_AITER`436437Реализует `TOS = TOS.__aiter__()`.438439Новое в версии 3.5.440441Изменено в версии 3.7: Возврат ожидаемых объектов из `__aiter__` больше не поддерживается.442443#### `GET_ANEXT`444445Помещает `get_awaitable(TOS.__anext__())` в стек. См. `GET_AWAITABLE` для подробностей о `get_awaitable`.446447Новое в версии 3.5.448449#### `END_ASYNC_FOR`450451Завершает цикл [`async for`](https://python-all.ru/3.10/reference/compound_stmts.html#async-for). Обрабатывает исключение, возникшее при ожидании следующего элемента. Если TOS равно [`StopAsyncIteration`](https://python-all.ru/3.10/library/exceptions.html#StopAsyncIteration), извлекает 7 значений из стека и восстанавливает состояние исключения, используя вторые три из них. В противном случае повторно возбуждает исключение, используя три значения из стека. Блок обработчика исключения удаляется из стека блоков.452453Новое в версии 3.8.454455#### `BEFORE_ASYNC_WITH`456457Извлекает `__aenter__` и `__aexit__` из объекта на вершине стека. Помещает `__aexit__` и результат `__aenter__()` в стек.458459Новое в версии 3.5.460461#### `SETUP_ASYNC_WITH`462463Создаёт новый объект фрейма.464465Новое в версии 3.5.466467**Прочие опкоды**468469#### `PRINT_EXPR`470471Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью [`POP_TOP`](https://python-all.ru/3.10/library/dis.html#opcode-POP_TOP).472473#### `SET_ADD(i)`474475Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).476477#### `LIST_APPEND(i)`478479Вызывает `list.append(TOS1[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).480481#### `MAP_ADD(i)`482483Вызывает `dict.__setitem__(TOS1[-i], TOS1, TOS)`. Используется для реализации словарных включений (dict comprehensions).484485Новое в версии 3.1.486487Изменено в версии 3.8: Значением отображения теперь является TOS, а ключом – TOS1. Ранее они были переставлены.488489Для всех инструкций [`SET_ADD`](https://python-all.ru/3.10/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.10/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.10/library/dis.html#opcode-MAP_ADD), когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.490491#### `RETURN_VALUE`492493Возвращает TOS вызывающей стороне функции.494495#### `YIELD_VALUE`496497Извлекает TOS и возвращает его из [генератора](https://python-all.ru/3.10/glossary.html#term-generator).498499#### `YIELD_FROM`500501Извлекает TOS и делегирует ему как под-итератор от [генератора](https://python-all.ru/3.10/glossary.html#term-generator).502503Новое в версии 3.3.504505#### `SETUP_ANNOTATIONS`506507Проверяет, определён ли `__annotations__` в `locals()`; если нет, он устанавливается в пустой `dict`. Этот опкод генерируется, только если тело класса или модуля статически содержит [аннотации переменных](https://python-all.ru/3.10/glossary.html#term-variable-annotation).508509Новое в версии 3.6.510511#### `IMPORT_STAR`512513Загружает все имена, не начинающиеся с `'_'`, из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует `from module import *`.514515#### `POP_BLOCK`516517Удаляет один блок из стека блоков. Для каждого фрейма существует стек блоков, обозначающий операторы [`try`](https://python-all.ru/3.10/reference/compound_stmts.html#try) и тому подобное.518519#### `POP_EXCEPT`520521Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.522523#### `RERAISE`524525Повторно возбуждает исключение, находящееся на вершине стека. Если oparg не равен нулю, восстанавливает `f_lasti` текущего фрейма до значения, которое было на момент возбуждения исключения.526527Новое в версии 3.9.528529#### `WITH_EXCEPT_START`530531Вызывает функцию, находящуюся на позиции 7 в стеке, передавая ей три верхних элемента стека в качестве аргументов. Используется для реализации вызова `context_manager.__exit__(*exc_info())`, когда исключение возникло в операторе [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with).532533Новое в версии 3.9.534535#### `LOAD_ASSERTION_ERROR`536537Помещает [`AssertionError`](https://python-all.ru/3.10/library/exceptions.html#AssertionError) в стек. Используется оператором [`assert`](https://python-all.ru/3.10/reference/simple_stmts.html#assert).538539Новое в версии 3.9.540541#### `LOAD_BUILD_CLASS`542543Помещает `builtins.__build_class__()` в стек. Позже он вызывается [`CALL_FUNCTION`](https://python-all.ru/3.10/library/dis.html#opcode-CALL_FUNCTION) для создания класса.544545#### `SETUP_WITH(delta)`546547Этот опкод выполняет несколько операций перед началом блока with. Сначала он загружает [`__exit__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__exit__) из контекстного менеджера и помещает его в стек для последующего использования [`WITH_EXCEPT_START`](https://python-all.ru/3.10/library/dis.html#opcode-WITH_EXCEPT_START). Затем вызывается [`__enter__()`](https://python-all.ru/3.10/reference/datamodel.html#object.__enter__), и помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода `__enter__()` помещается в стек. Следующий опкод либо игнорирует его ([`POP_TOP`](https://python-all.ru/3.10/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную(ые) ([`STORE_FAST`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/3.10/library/dis.html#opcode-UNPACK_SEQUENCE)).548549Новое в версии 3.2.550551#### `COPY_DICT_WITHOUT_KEYS`552553TOS – это кортеж ключей отображения, а TOS1 – это объект сопоставления. Заменить TOS на [`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict), сформированный из элементов TOS1, но без каких-либо ключей, присутствующих в TOS.554555Новое в версии 3.10.556557#### `GET_LEN`558559Помещает `len(TOS)` в стек.560561Новое в версии 3.10.562563#### `MATCH_MAPPING`564565Если TOS является экземпляром [`collections.abc.Mapping`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Mapping) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.10/c-api/typeobj.html#Py_TPFLAGS_MAPPING) в [`tp_flags`](https://python-all.ru/3.10/c-api/typeobj.html#c.PyTypeObject.tp_flags)), помещает `True` в стек. В противном случае помещает `False`.566567Новое в версии 3.10.568569#### `MATCH_SEQUENCE`570571Если TOS является экземпляром [`collections.abc.Sequence`](https://python-all.ru/3.10/library/collections.abc.html#collections.abc.Sequence) и *не* является экземпляром [`str`](https://python-all.ru/3.10/library/stdtypes.html#str)/[`bytes`](https://python-all.ru/3.10/library/stdtypes.html#bytes)/[`bytearray`](https://python-all.ru/3.10/library/stdtypes.html#bytearray) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.10/c-api/typeobj.html#Py_TPFLAGS_SEQUENCE) в его [`tp_flags`](https://python-all.ru/3.10/c-api/typeobj.html#c.PyTypeObject.tp_flags)), поместить `True` в стек. В противном случае поместить `False`.572573Новое в версии 3.10.574575#### `MATCH_KEYS`576577TOS – это кортеж ключей отображения, а TOS1 – объект сопоставления. Если TOS1 содержит все ключи из TOS, поместить в стек [`tuple`](https://python-all.ru/3.10/library/stdtypes.html#tuple), содержащий соответствующие значения, а затем `True`. В противном случае поместить `None`, а затем `False`.578579Новое в версии 3.10.580581Все следующие опкоды используют свои аргументы.582583#### `STORE_NAME(namei)`584585Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор пытается использовать [`STORE_FAST`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_GLOBAL), если это возможно.586587#### `DELETE_NAME(namei)`588589Реализует `del name`, где *namei* – это индекс в атрибут `co_names` объекта кода.590591#### `UNPACK_SEQUENCE(count)`592593Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.594595#### `UNPACK_EX(counts)`596597Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.598599Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.600601#### `STORE_ATTR(namei)`602603Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.604605#### `DELETE_ATTR(namei)`606607Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.608609#### `STORE_GLOBAL(namei)`610611Работает как [`STORE_NAME`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.612613#### `DELETE_GLOBAL(namei)`614615Работает как [`DELETE_NAME`](https://python-all.ru/3.10/library/dis.html#opcode-DELETE_NAME), но удаляет глобальное имя.616617#### `LOAD_CONST(consti)`618619Помещает `co_consts[consti]` в стек.620621#### `LOAD_NAME(namei)`622623Помещает значение, связанное с `co_names[namei]`, в стек.624625#### `BUILD_TUPLE(count)`626627Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.628629#### `BUILD_LIST(count)`630631Работает как [`BUILD_TUPLE`](https://python-all.ru/3.10/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.632633#### `BUILD_SET(count)`634635Работает как [`BUILD_TUPLE`](https://python-all.ru/3.10/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.636637#### `BUILD_MAP(count)`638639Помещает новый объект словаря в стек. Извлекает `2 * count` элементов так, чтобы словарь содержал *count* записей: `{..., TOS3: TOS2, TOS1: TOS}`.640641Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для *count* элементов.642643#### `BUILD_CONST_KEY_MAP(count)`644645Версия [`BUILD_MAP`](https://python-all.ru/3.10/library/dis.html#opcode-BUILD_MAP), оптимизированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, затем, начиная с `TOS1`, снимает *count* значений и формирует словарь.646647Новое в версии 3.6.648649#### `BUILD_STRING(count)`650651Конкатенирует *count* строк из стека и помещает результирующую строку в стек.652653Новое в версии 3.6.654655#### `LIST_TO_TUPLE`656657Извлекает список из стека и помещает кортеж, содержащий те же значения.658659Новое в версии 3.9.660661#### `LIST_EXTEND(i)`662663Вызывает `list.extend(TOS1[-i], TOS)`. Используется для построения списков.664665Новое в версии 3.9.666667#### `SET_UPDATE(i)`668669Вызывает `set.update(TOS1[-i], TOS)`. Используется для создания множеств.670671Новое в версии 3.9.672673#### `DICT_UPDATE(i)`674675Вызывает `dict.update(TOS1[-i], TOS)`. Используется для создания словарей.676677Новое в версии 3.9.678679#### `DICT_MERGE`680681Как [`DICT_UPDATE`](https://python-all.ru/3.10/library/dis.html#opcode-DICT_UPDATE), но вызывает исключение для повторяющихся ключей.682683Новое в версии 3.9.684685#### `LOAD_ATTR(namei)`686687Заменяет TOS на `getattr(TOS, co_names[namei])`.688689#### `COMPARE_OP(opname)`690691Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname]`.692693#### `IS_OP(invert)`694695Выполняет сравнение `is` или `is not`, если `invert` равно 1.696697Новое в версии 3.9.698699#### `CONTAINS_OP(invert)`700701Выполняет сравнение `in` или `not in`, если `invert` равно 1.702703Новое в версии 3.9.704705#### `IMPORT_NAME(namei)`706707Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и передаются в качестве аргументов *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.10/library/functions.html#import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкция [`STORE_FAST`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.708709#### `IMPORT_FROM(namei)`710711Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.10/library/dis.html#opcode-STORE_FAST).712713#### `JUMP_FORWARD(delta)`714715Увеличивает счётчик байт-кода на *delta*.716717#### `POP_JUMP_IF_TRUE(target)`718719Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.720721Новое в версии 3.1.722723#### `POP_JUMP_IF_FALSE(target)`724725Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.726727Новое в версии 3.1.728729#### `JUMP_IF_NOT_EXC_MATCH(target)`730731Проверяет, является ли второе значение в стеке исключением, совпадающим с TOS, и переходит, если это не так. Извлекает два значения из стека.732733Новое в версии 3.9.734735#### `JUMP_IF_TRUE_OR_POP(target)`736737Если TOS истинно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.738739Новое в версии 3.1.740741#### `JUMP_IF_FALSE_OR_POP(target)`742743Если TOS ложно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.744745Новое в версии 3.1.746747#### `JUMP_ABSOLUTE(target)`748749Устанавливает счётчик байткода в *target*.750751#### `FOR_ITER(delta)`752753TOS является [итератором](https://python-all.ru/3.10/glossary.html#term-iterator). Вызвать его метод [`__next__()`](https://python-all.ru/3.10/library/stdtypes.html#iterator.__next__). Если это даёт новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, TOS удаляется из стека, а счётчик байт-кода увеличивается на *delta*.754755#### `LOAD_GLOBAL(namei)`756757Загружает глобальную переменную `co_names[namei]` в стек.758759#### `SETUP_FINALLY(delta)`760761Помещает блок try из предложения try-finally или try-except на стек блоков. *delta* указывает на блок finally или первый блок except.762763#### `LOAD_FAST(var_num)`764765Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.766767#### `STORE_FAST(var_num)`768769Сохраняет TOS в локальную переменную `co_varnames[var_num]`.770771#### `DELETE_FAST(var_num)`772773Удаляет локальную переменную `co_varnames[var_num]`.774775#### `LOAD_CLOSURE(i)`776777Помещает ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае – `co_freevars[i - len(co_cellvars)]`.778779#### `LOAD_DEREF(i)`780781Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.782783#### `LOAD_CLASSDEREF(i)`784785Похожа на [`LOAD_DEREF`](https://python-all.ru/3.10/library/dis.html#opcode-LOAD_DEREF), но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.786787Новое в версии 3.4.788789#### `STORE_DEREF(i)`790791Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.792793#### `DELETE_DEREF(i)`794795Очищает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Используется оператором [`del`](https://python-all.ru/3.10/reference/simple_stmts.html#del).796797Новое в версии 3.2.798799#### `RAISE_VARARGS(argc)`800801Вызывает исключение, используя одну из трёх форм оператора `raise`, в зависимости от значения *argc*:802803- 0: `raise` (повторный вызов предыдущего исключения)804- 1: `raise TOS` (вызов экземпляра или типа исключения по адресу `TOS`)805- 2: `raise TOS1 from TOS` (возбуждает экземпляр или тип исключения на `TOS1` с `__cause__` установленным в `TOS`)806807#### `CALL_FUNCTION(argc)`808809Вызывает вызываемый объект с позиционными аргументами. *argc* указывает количество позиционных аргументов. Вершина стека содержит позиционные аргументы, причём самый правый аргумент находится на вершине. Под аргументами находится вызываемый объект. `CALL_FUNCTION` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.810811Изменено в версии 3.6: Эта инструкция используется только для вызовов с позиционными аргументами.812813#### `CALL_FUNCTION_KW(argc)`814815Вызывает вызываемый объект с позиционными (если есть) и именованными аргументами. *argc* указывает общее количество позиционных и именованных аргументов. Верхний элемент стека содержит кортеж с именами именованных аргументов, которые должны быть строками. Под ним находятся значения именованных аргументов в порядке, соответствующем кортежу. Под ними находятся позиционные аргументы, причём самый правый параметр на вершине. Под аргументами находится вызываемый объект. `CALL_FUNCTION_KW` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом, в стек.816817Изменено в версии 3.6: Именованные аргументы упаковываются в кортеж вместо словаря, *argc* указывает общее количество аргументов.818819#### `CALL_FUNCTION_EX(flags)`820821Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит *flags*, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. `CALL_FUNCTION_EX` извлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.822823Новое в версии 3.6.824825#### `LOAD_METHOD(namei)`826827Загружает метод с именем `co_names[namei]` из объекта TOS. TOS удаляется из стека. Этот байт-код различает два случая: если TOS имеет метод с правильным именем, он помещает в стек несвязанный метод и TOS. TOS будет использоваться как первый аргумент (`self`) в [`CALL_METHOD`](https://python-all.ru/3.10/library/dis.html#opcode-CALL_METHOD) при вызове несвязанного метода. В противном случае помещаются `NULL` и объект, возвращённый поиском атрибута.828829Добавлено в версии 3.7.830831#### `CALL_METHOD(argc)`832833Вызывает метод. *argc* – количество позиционных аргументов. Именованные аргументы не поддерживаются. Эта инструкция предназначена для использования с [`LOAD_METHOD`](https://python-all.ru/3.10/library/dis.html#opcode-LOAD_METHOD). Позиционные аргументы находятся на вершине стека. Под ними находятся два элемента, описанные в [`LOAD_METHOD`](https://python-all.ru/3.10/library/dis.html#opcode-LOAD_METHOD) (либо `self` и несвязанный метод, либо `NULL` и произвольный вызываемый объект). Все они извлекаются, и возвращаемое значение помещается в стек.834835Добавлено в версии 3.7.836837#### `MAKE_FUNCTION(flags)`838839Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.840841- `0x01` кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке842- `0x02` словарь значений по умолчанию только-именованных параметров843- `0x04` кортеж строк, содержащих аннотации параметров844- `0x08` кортеж, содержащий ячейки для свободных переменных, образующий замыкание845- код, связанный с функцией (на TOS1)846- [полное имя](https://python-all.ru/3.10/glossary.html#term-qualified-name) функции (на TOS)847848Изменено в версии 3.10: Значение флага `0x04` теперь является кортежем строк вместо словаря849850#### `BUILD_SLICE(argc)`851852Помещает объект среза в стек. *argc* должен быть 2 или 3. Если равно 2, помещается `slice(TOS1, TOS)`; если 3, помещается `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.10/library/functions.html#slice).853854#### `EXTENDED_ARG(ext)`855856Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. *ext* содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов `EXTENDED_ARG`, формирующих аргумент от двух до четырёх байт.857858#### `FORMAT_VALUE(flags)`859860Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную *спецификацию формата*, затем обязательное *значение*. *Флаги* интерпретируются следующим образом:861862- `(flags & 0x03) == 0x00`: *значение* форматируется как есть.863- `(flags & 0x03) == 0x01`: извлечь [спецификацию формата](https://python-all.ru/3.10/library/stdtypes.html#str) из стека и использовать её, иначе использовать пустую *спецификацию формата*.864- `(flags & 0x03) == 0x02`: извлечь [спецификацию формата](https://python-all.ru/3.10/library/functions.html#repr) из стека и использовать её, иначе использовать пустую *спецификацию формата*.865- `(flags & 0x03) == 0x03`: извлечь [спецификацию формата](https://python-all.ru/3.10/library/functions.html#ascii) из стека и использовать её, иначе использовать пустую *спецификацию формата*.866- `(flags & 0x04) == 0x04`: извлечь *fmt\_spec* из стека и использовать его, иначе использовать пустой *fmt\_spec*.867868Форматирование выполняется с помощью [`PyObject_Format()`](https://python-all.ru/3.10/c-api/object.html#c.PyObject_Format). Результат помещается в стек.869870Новое в версии 3.6.871872#### `MATCH_CLASS(count)`873874TOS – это кортеж имен ключевых атрибутов, TOS1 – класс, с которым производится сопоставление, а TOS2 – объект сопоставления. *count* – количество позиционных подшаблонов.875876Извлечь TOS. Если TOS2 является экземпляром TOS1 и имеет позиционные и именованные атрибуты, требуемые *count* и TOS, установить TOS в `True`, а TOS1 – в кортеж извлечённых атрибутов. В противном случае установить TOS в `False`.877878Новое в версии 3.10.879880#### `GEN_START(kind)`881882> Извлекает TOS. Операнд `kind` соответствует типу генератора или корутины. Допустимые значения: 0 для генератора, 1 для корутины и 2 для асинхронного генератора.883884Новое в версии 3.10.885886#### `ROT_N(count)`887888Поднять первые *count* элементов стека на одну позицию вверх и переместить TOS вниз на позицию *count*.889890Новое в версии 3.10.891892#### `HAVE_ARGUMENT`893894Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно `< HAVE_ARGUMENT` и `>= HAVE_ARGUMENT`).895896Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды `< HAVE_ARGUMENT` игнорируют его. Раньше аргумент был только у опкодов `>= HAVE_ARGUMENT`.897898## Коллекции опкодов899900Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:901902#### `dis.opname`903904Последовательность имён операций, индексируемая с помощью байткода.905906#### `dis.opmap`907908Словарь, сопоставляющий имена операций с байткодами.909910#### `dis.cmp_op`911912Последовательность всех имён операций сравнения.913914#### `dis.hasconst`915916Последовательность байткодов, обращающихся к константе.917918#### `dis.hasfree`919920Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она *не* включает ссылки на глобальные или встроенные области видимости).921922#### `dis.hasname`923924Последовательность байткодов, обращающихся к атрибуту по имени.925926#### `dis.hasjrel`927928Последовательность байткодов, имеющих относительную цель перехода.929930#### `dis.hasjabs`931932Последовательность байткодов, имеющих абсолютную цель перехода.933934#### `dis.haslocal`935936Последовательность байткодов, обращающихся к локальной переменной.937938#### `dis.hascompare`939940Последовательность байткодов логических операций.941