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

dis.md

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

1> **Источник:** https://python-all.ru/3.16/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `dis` – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/main/Lib/dis.py)1011---1213Модуль `dis` поддерживает анализ [байт-кода](https://python-all.ru/3.16/glossary.html#term-bytecode) CPython путём eго дизассемблирования. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.1617Изменено в версии 3.6: Для каждой инструкции используется 2 байта. Ранее количество байт зависело от инструкции.1819Изменено в версии 3.10: Аргументом инструкций перехода, обработки исключений и циклов теперь является смещение инструкции, а не смещение байта.2021Изменено в версии 3.11: Некоторые инструкции сопровождаются одной или несколькими записями встроенного кэша, которые имеют форму инструкций [`CACHE`](https://python-all.ru/3.16/library/dis.html#opcode-CACHE). Эти инструкции по умолчанию скрыты, но их можно показать, передав `show_caches=True` любой `dis` утилите. Кроме того, интерпретатор теперь адаптирует байт-код для специализации под разные условия выполнения. Адаптивный байт-код можно показать, передав `adaptive=True`.2223Изменено в версии 3.12: Аргумент перехода – это смещение целевой инструкции относительно инструкции, следующей сразу за записями [`CACHE`](https://python-all.ru/3.16/library/dis.html#opcode-CACHE) инструкции перехода.2425Как следствие, наличие инструкций [`CACHE`](https://python-all.ru/3.16/library/dis.html#opcode-CACHE) прозрачно для прямых переходов, но должно учитываться при анализе обратных переходов.2627Изменено в версии 3.13: В выводе отображаются логические метки, а не смещения инструкций для целей перехода и обработчиков исключений. Добавлены опция командной строки `-O` и аргумент `show_offsets`.2829Изменено в версии 3.14: Добавлены опция командной строки [`-P`](https://python-all.ru/3.16/library/dis.html#cmdoption-dis-P) и аргумент `show_positions`.3031Добавлена опция командной строки [`-S`](https://python-all.ru/3.16/library/dis.html#cmdoption-dis-S).3233Пример: Дана функция `myfunc()`:3435```python36def myfunc(alist):37    return len(alist)38```3940следующую команду можно использовать для отображения дизассемблирования `myfunc()`:4142```pycon43>>> dis.dis(myfunc)44  2           RESUME                   04546  3           LOAD_GLOBAL              1 (len + NULL)47              LOAD_FAST_BORROW         0 (alist)48              CALL                     149              RETURN_VALUE50```5152(«2» – это номер строки).5354## Интерфейс командной строки5556Модуль `dis` можно вызвать как сценарий из командной строки:5758```sh59python -m dis [-h] [-C] [-O] [-P] [-S] [infile]60```6162Принимаются следующие опции:6364#### `-h, --help`6566Показать справку и выйти.6768#### `-C, --show-caches`6970Показать встроенные кэши.7172Добавлено в версии 3.13.7374#### `-O, --show-offsets`7576Показать смещения инструкций.7778Добавлено в версии 3.13.7980#### `-P, --show-positions`8182Показать позиции инструкций в исходном коде.8384Добавлено в версии 3.14.8586#### `-S, --specialized`8788Показать специализированный байт-код.8990Добавлено в версии 3.14.9192Если указан `infile`, его дизассемблированный код будет выведен в stdout. В противном случае дизассемблирование выполняется над скомпилированным исходным кодом, полученным из stdin.9394## Анализ байт-кода9596Добавлено в версии 3.4.9798API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode), который предоставляет удобный доступ к деталям скомпилированного кода.99100#### `class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)`101102Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается [`compile()`](https://python-all.ru/3.16/library/functions.html#compile)).103104Это удобная обёртка над многими функциями, перечисленными ниже, особенно [`get_instructions()`](https://python-all.ru/3.16/library/dis.html#dis.get_instructions), поскольку итерация по экземпляру `Bytecode` возвращает операции байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.16/library/dis.html#dis.Instruction).105106Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.107108Если *current\_offset* не равно `None`, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет отображать маркер «текущая инструкция» напротив указанной операции.109110Если *show\_caches* равно `True`, [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет отображать записи inline-кэша, используемые интерпретатором для специализации байткода.111112Если *adaptive* равно `True`, [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет отображать специализированный байткод, который может отличаться от исходного.113114Если *show\_offsets* равно `True`, [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет включать смещения инструкций в вывод.115116Если *show\_positions* равно `True`, [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет включать позиции инструкций в исходном коде в вывод.117118Если *show\_jit* установлен в `True`, [`dis()`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode.dis) будет показывать `ENTER_EXECUTOR` инструкции, которые отмечают точки входа JIT и по умолчанию скрыты.119120#### `classmethod from_traceback(tb, *, show_caches=False)`121122Создаёт экземпляр `Bytecode` из заданного traceback, устанавливая *current\_offset* на инструкцию, ответственную за исключение.123124#### `codeobj`125126Скомпилированный объект кода.127128#### `first_line`129130Первая строка исходного кода объекта кода (если доступна)131132#### `dis()`133134Возвращает форматированное представление операций байткода (то же, что выводится [`dis.dis()`](https://python-all.ru/3.16/library/dis.html#dis.dis), но возвращается в виде многострочной строки).135136#### `info()`137138Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.16/library/dis.html#dis.code_info).139140Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.141142Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.143144Изменено в версии 3.13: Добавлен параметр *show\_offsets*.145146Изменено в версии 3.14: Добавлен параметр *show\_positions*.147148Changed in version 3.16.0a0 (unreleased): Added the *show\_jit* parameter.149150Пример:151152```pycon153>>> bytecode = dis.Bytecode(myfunc)154>>> for instr in bytecode:155...     print(instr.opname)156...157RESUME158LOAD_GLOBAL159LOAD_FAST_BORROW160CALL161RETURN_VALUE162```163164## Функции анализа165166Модуль `dis` также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:167168#### `dis.code_info(x)`169170Возвращает форматированную многострочную строку с подробной информацией об объекте кода для указанной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.171172Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.173174Добавлено в версии 3.2.175176Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.177178#### `dis.show_code(x, *, file=None)`179180Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или `sys.stdout`, если *file* не указан).181182Это удобная краткая форма для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.183184Добавлено в версии 3.2.185186Изменено в версии 3.4: Добавлен параметр *file*.187188#### `dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)`189190Дисассемблирует объект *x*. *x* может обозначать модуль, класс, метод, функцию, генератор, асинхронный генератор, корутину, объект кода, строку исходного кода или последовательность байтов сырого байткода. Для модуля дисассемблируются все функции. Для класса дисассемблируются все методы (включая методы класса и статические). Для объекта кода или последовательности сырого байткода выводится одна строка на каждую инструкцию байткода. Также рекурсивно дисассемблируются вложенные объекты кода. К ним могут относиться генераторные выражения, вложенные функции, тела вложенных классов и объекты кода, используемые для [областей аннотаций](https://python-all.ru/3.16/reference/executionmodel.html#annotation-scopes). Строки сначала компилируются в объекты кода с помощью встроенной функции [`compile()`](https://python-all.ru/3.16/library/functions.html#compile) перед дисассемблированием. Если объект не указан, эта функция дисассемблирует последний traceback.191192Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.193194Максимальная глубина рекурсии ограничивается параметром *depth*, если только он не равен `None`. `depth=0` означает отсутствие рекурсии.195196Если *show\_caches* равен `True`, функция будет показывать записи инлайн-кэша, которые интерпретатор использует для специализации байткода.197198Если *adaptive* равен `True`, функция будет показывать специализированный байткод, который может отличаться от исходного.199200Если *show\_jit* установлен в `True`, эта функция будет показывать `ENTER_EXECUTOR` инструкции, которые отмечают точки входа JIT и по умолчанию скрыты.201202Изменено в версии 3.4: Добавлен параметр *file*.203204Изменено в версии 3.7: Реализовано рекурсивное дисассемблирование и добавлен параметр *depth*.205206Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.207208Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.209210Изменено в версии 3.13: Добавлен параметр *show\_offsets*.211212Изменено в версии 3.14: Добавлен параметр *show\_positions*.213214Changed in version 3.16.0a0 (unreleased): Added the *show\_jit* parameter.215216#### `dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)`217218Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.219220Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.221222Изменено в версии 3.4: Добавлен параметр *file*.223224Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.225226Изменено в версии 3.13: Добавлен параметр *show\_offsets*.227228Изменено в версии 3.14: Добавлен параметр *show\_positions*.229230Changed in version 3.16.0a0 (unreleased): Added the *show\_jit* parameter.231232#### `dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)`233234#### `dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False, show_jit=False)`235236Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:2372381. местоположение инструкции в исходном коде. Полная информация о местоположении отображается, если *show\_positions* равен true. В противном случае (по умолчанию) отображается только номер строки.2392. текущая инструкция, помечена как `-->`,2403. инструкция с меткой, помечена `>>`,2414. адрес инструкции,2425. название кода операции,2436. параметры операции и2447. интерпретация параметров в скобках.245246Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.247248Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.249250Изменено в версии 3.4: Добавлен параметр *file*.251252Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.253254Изменено в версии 3.13: Добавлен параметр *show\_offsets*.255256Изменено в версии 3.14: Добавлен параметр *show\_positions*.257258Changed in version 3.16.0a0 (unreleased): Added the *show\_jit* parameter.259260#### `dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False, show_jit=False)`261262Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.263264Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.16/library/dis.html#dis.Instruction), содержащих сведения о каждой операции в переданном коде.265266Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.267268Параметр *adaptive* работает так же, как в [`dis()`](https://python-all.ru/3.16/library/dis.html#module-dis).269270Параметр *show\_jit* работает так же, как и в [`dis()`](https://python-all.ru/3.16/library/dis.html#module-dis).271272Добавлено в версии 3.4.273274Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.275276Изменено в версии 3.13: Параметр *show\_caches* устарел и не действует. Итератор создаёт экземпляры [`Instruction`](https://python-all.ru/3.16/library/dis.html#dis.Instruction) с заполненным полем *cache\_info* (независимо от значения *show\_caches*) и больше не генерирует отдельные элементы для записей кэша.277278Changed in version 3.16.0a0 (unreleased): Added the *show\_jit* parameter.279280#### `dis.findlinestarts(code)`281282Эта функция-генератор использует метод [`co_lines()`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_lines) [объекта кода](https://python-all.ru/3.16/reference/datamodel.html#code-objects) *code* для поиска смещений, которые являются началами строк в исходном коде. Они генерируются в виде пар `(offset, lineno)`.283284Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.285286Изменено в версии 3.10: Метод [**PEP 626**](https://python-all.ru/3.16/library/dis.html) [`co_lines()`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_lines) используется вместо атрибутов [`co_firstlineno`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_firstlineno) и `codeobject.co_lnotab` [объекта кода](https://python-all.ru/3.16/reference/datamodel.html#code-objects).287288Изменено в версии 3.13: Номера строк могут быть `None` для байткода, который не соответствует строкам исходного кода.289290#### `dis.findlabels(code)`291292Обнаруживает все смещения в сырой скомпилированной строке байткода *code*, которые являются целями переходов, и возвращает список этих смещений.293294#### `dis.stack_effect(opcode, oparg=None, *, jump=None)`295296Вычисляет эффект стека для *opcode* с аргументом *oparg*.297298Если код имеет цель перехода и *jump* равен `True`, `stack_effect()` возвращает эффект стека при переходе. Если *jump* равен `False`, возвращается эффект стека при отсутствии перехода. А если *jump* равен `None` (по умолчанию), возвращается максимальный эффект стека для обоих случаев.299300Добавлено в версии 3.4.301302Изменено в версии 3.8: Добавлен параметр *jump*.303304Изменено в версии 3.13: Если `oparg` опущен (или `None`), эффект стека теперь возвращается для `oparg=0`. Ранее это было ошибкой для опкодов, использующих свой аргумент. Также больше не является ошибкой передача целого числа `oparg`, когда `opcode` его не использует; в этом случае `oparg` игнорируется.305306## Инструкции байткода Python307308Функция [`get_instructions()`](https://python-all.ru/3.16/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.16/library/dis.html#dis.Bytecode) предоставляют сведения об инструкциях байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.16/library/dis.html#dis.Instruction):309310#### `class dis.Instruction`311312Подробности об операции байткода313314#### `opcode`315316Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [коллекциях Opcode](https://python-all.ru/3.16/library/dis.html#opcode-collections).317318#### `opname`319320Человекочитаемое имя операции321322#### `baseopcode`323324Числовой код базовой операции, если операция специализирована; иначе равен [`opcode`](https://python-all.ru/3.16/library/dis.html#dis.Instruction.opcode)325326#### `baseopname`327328человекочитаемое имя базовой операции, если операция специализирована; иначе равно [`opname`](https://python-all.ru/3.16/library/dis.html#dis.opname)329330#### `arg`331332числовой аргумент операции (если есть), иначе `None`333334#### `oparg`335336псевдоним для [`arg`](https://python-all.ru/3.16/library/dis.html#dis.Instruction.arg)337338#### `argval`339340разрешённое значение аргумента (если есть), иначе `None`341342#### `argrepr`343344человекочитаемое описание аргумента операции (если есть), иначе пустая строка.345346#### `offset`347348начальный индекс операции в последовательности байт-кода349350#### `start_offset`351352начальный индекс операции в последовательности байт-кода, включая префиксные операции `EXTENDED_ARG`, если они есть; в противном случае равно [`offset`](https://python-all.ru/3.16/library/dis.html#dis.Instruction.offset)353354#### `cache_offset`355356начальный индекс записей кэша, следующих за операцией357358#### `end_offset`359360конечный индекс записей кэша, следующих за операцией361362#### `starts_line`363364`True`, если этот опкод начинает строку исходного кода, иначе `False`365366#### `line_number`367368номер строки исходного кода, связанный с этим опкодом (если есть), иначе `None`369370#### `is_jump_target`371372`True`, если другой код переходит сюда, иначе `False`373374#### `jump_target`375376индекс байт-кода цели перехода, если это операция перехода, иначе `None`377378#### `positions`379380объект [`dis.Positions`](https://python-all.ru/3.16/library/dis.html#dis.Positions), содержащий начальные и конечные позиции, которые охватываются этой инструкцией.381382#### `cache_info`383384Информация о записях кэша этой инструкции в виде троек вида `(name, size, data)`, где `name` и `size` описывают формат кэша, а data – содержимое кэша. `cache_info` равно `None`, если у инструкции нет кэша.385386Добавлено в версии 3.4.387388Изменено в версии 3.11: Добавлено поле `positions`.389390Изменено в версии 3.13: Изменено поле `starts_line`.391392Добавлены поля `start_offset`, `cache_offset`, `end_offset`, `baseopname`, `baseopcode`, `jump_target`, `oparg`, `line_number` и `cache_info`.393394#### `class dis.Positions`395396Если информация недоступна, некоторые поля могут быть `None`.397398#### `lineno`399400#### `end_lineno`401402#### `col_offset`403404#### `end_col_offset`405406Добавлено в версии 3.12.407408В настоящее время компилятор Python генерирует следующие инструкции байткода.409410**Общие инструкции**411412В дальнейшем мы будем называть стек интерпретатора `STACK` и описывать операции с ним так, как если бы это был список Python. Вершина стека соответствует `STACK[-1]` в этом языке.413414#### `NOP`415416Код, который ничего не делает. Используется оптимизатором байткода как заполнитель, а также для генерации событий трассировки строк.417418#### `NOT_TAKEN`419420Код, который ничего не делает. Используется интерпретатором для записи [`BRANCH_LEFT`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-BRANCH_LEFT) и [`BRANCH_RIGHT`](https://python-all.ru/3.16/library/sys.monitoring.html#monitoring-event-BRANCH_RIGHT) событий для [`sys.monitoring`](https://python-all.ru/3.16/library/sys.monitoring.html#module-sys.monitoring).421422Добавлено в версии 3.14.423424#### `POP_ITER`425426Удаляет итератор с вершины стека.427428Добавлено в версии 3.14.429430#### `POP_TOP`431432Удаляет элемент с вершины стека:433434```python435STACK.pop()436```437438#### `END_FOR`439440Удаляет элемент с вершины стека. Эквивалентно `POP_TOP`. Используется для очистки в конце циклов, отсюда и название.441442Добавлено в версии 3.12.443444#### `END_SEND`445446Реализует `del STACK[-2]`. Используется для очистки при завершении генератора.447448Добавлено в версии 3.12.449450#### `COPY(i)`451452Помещает i-й элемент на вершину стека, не удаляя его из исходной позиции:453454```python455assert i > 0456STACK.append(STACK[-i])457```458459Добавлено в версии 3.12.460461#### `SWAP(i)`462463Меняет местами вершину стека и i-й элемент:464465```python466STACK[-i], STACK[-1] = STACK[-1], STACK[-i]467```468469Добавлено в версии 3.12.470471#### `CACHE`472473Вместо того чтобы быть реальной инструкцией, этот опкод используется для разметки дополнительного пространства, чтобы интерпретатор мог кэшировать полезные данные непосредственно в байткоде. Он автоматически скрывается всеми утилитами `dis`, но может быть просмотрен с помощью `show_caches=True`.474475Логически это пространство является частью предыдущей инструкции. Многие опкоды ожидают, что за ними следует точное количество кэшей, и будут указывать интерпретатору пропускать их во время выполнения.476477Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует проявлять большую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.478479Добавлено в версии 3.12.480481**Унарные операции**482483Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.484485#### `UNARY_NEGATIVE`486487Реализует `STACK[-1] = -STACK[-1]`.488489#### `UNARY_NOT`490491Реализует `STACK[-1] = not STACK[-1]`.492493Изменено в версии 3.13: Теперь для этой инструкции требуется точный операнд [`bool`](https://python-all.ru/3.16/library/functions.html#bool).494495#### `UNARY_INVERT`496497Реализует `STACK[-1] = ~STACK[-1]`.498499#### `GET_ITER`500501Реализует `STACK[-1] = iter(STACK[-1])`.502503#### `GET_YIELD_FROM_ITER`504505Если `STACK[-1]` является объектом [генераторный итератор](https://python-all.ru/3.16/glossary.html#term-generator-iterator) или [корутина](https://python-all.ru/3.16/glossary.html#term-coroutine), он остаётся без изменений. В противном случае реализует `STACK[-1] = iter(STACK[-1])`.506507Добавлено в версии 3.5.508509#### `TO_BOOL`510511Реализует `STACK[-1] = bool(STACK[-1])`.512513Добавлено в версии 3.13.514515**Бинарные операции и операции на месте**516517Бинарные операции удаляют два верхних элемента из стека (`STACK[-1]` и `STACK[-2]`). Затем они выполняют операцию и помещают результат обратно в стек.518519Операции на месте похожи на бинарные, но выполняются непосредственно в памяти (на месте), когда `STACK[-2]` это поддерживает, и результирующий `STACK[-1]` может (но не обязан) быть исходным `STACK[-2]`.520521#### `BINARY_OP(op)`522523Реализует бинарные операторы и операторы на месте (в зависимости от значения *op*):524525```python526rhs = STACK.pop()527lhs = STACK.pop()528STACK.append(lhs op rhs)529```530531Добавлено в версии 3.12.532533Изменено в версии 3.14: С oparg :`NB_SUBSCR`, реализует бинарную индексацию (заменяет код операции `BINARY_SUBSCR`)534535#### `STORE_SUBSCR`536537Реализует:538539```python540key = STACK.pop()541container = STACK.pop()542value = STACK.pop()543container[key] = value544```545546#### `DELETE_SUBSCR`547548Реализует:549550```python551key = STACK.pop()552container = STACK.pop()553del container[key]554```555556#### `BINARY_SLICE`557558Реализует:559560```python561end = STACK.pop()562start = STACK.pop()563container = STACK.pop()564STACK.append(container[start:end])565```566567Добавлено в версии 3.12.568569#### `STORE_SLICE`570571Реализует:572573```python574end = STACK.pop()575start = STACK.pop()576container = STACK.pop()577value = STACK.pop()578container[start:end] = value579```580581Добавлено в версии 3.12.582583**Коды операций корутин**584585#### `GET_AWAITABLE(where)`586587Реализует `STACK[-1] = get_awaitable(STACK[-1])`, где `get_awaitable(o)` возвращает `o`, если `o` является объектом корутины или объектом-генератором с флагом [`CO_ITERABLE_COROUTINE`](https://python-all.ru/3.16/library/inspect.html#inspect.CO_ITERABLE_COROUTINE), или разрешает `o.__await__`.588589> Если операнд `where` не равен нулю, он указывает, где находится инструкция :590>591> - `1`: После вызова `__aenter__`592> - `2`: После вызова `__aexit__`593594Добавлено в версии 3.5.595596Изменено в версии 3.11: Ранее эта инструкция не имела oparg.597598#### `GET_AITER`599600Реализует `STACK[-1] = STACK[-1].__aiter__()`.601602Добавлено в версии 3.5.603604Изменено в версии 3.7: Возврат ожидаемых объектов из `__aiter__` больше не поддерживается.605606#### `GET_ANEXT`607608Реализует `STACK.append(get_awaitable(STACK[-1].__anext__()))` в стеке. См. `GET_AWAITABLE` для подробностей о `get_awaitable`.609610Добавлено в версии 3.5.611612#### `END_ASYNC_FOR`613614Завершает цикл [`async for`](https://python-all.ru/3.16/reference/compound_stmts.html#async-for). Обрабатывает исключение, возбуждённое при ожидании следующего элемента. Стек содержит асинхронный итерируемый объект в `STACK[-2]` и возбуждённое исключение в `STACK[-1]`. Оба извлекаются. Если исключение не является [`StopAsyncIteration`](https://python-all.ru/3.16/library/exceptions.html#StopAsyncIteration), оно возбуждается повторно.615616Добавлено в версии 3.8.617618Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.619620#### `CLEANUP_THROW`621622Обрабатывает исключение, возбуждённое во время вызова [`throw()`](https://python-all.ru/3.16/reference/expressions.html#generator.throw) или [`close()`](https://python-all.ru/3.16/reference/expressions.html#generator.close) через текущий фрейм. Если `STACK[-1]` является экземпляром [`StopIteration`](https://python-all.ru/3.16/library/exceptions.html#StopIteration), извлекаются три значения из стека и помещается его член `value`. В противном случае `STACK[-1]` пробрасывается повторно.623624Добавлено в версии 3.12.625626**Прочие опкоды**627628#### `SET_ADD(i)`629630Реализует:631632```python633item = STACK.pop()634set.add(STACK[-i], item)635```636637Используется для реализации включений множеств.638639#### `LIST_APPEND(i)`640641Реализует:642643```python644item = STACK.pop()645list.append(STACK[-i], item)646```647648Используется для реализации включений списков.649650#### `MAP_ADD(i)`651652Реализует:653654```python655value = STACK.pop()656key = STACK.pop()657dict.__setitem__(STACK[-i], key, value)658```659660Используется для реализации включений словарей.661662Добавлено в версии 3.1.663664Изменено в версии 3.8: Значение карты – `STACK[-1]`, а ключ карты – `STACK[-2]`. Ранее они были переставлены местами.665666Для всех инструкций [`SET_ADD`](https://python-all.ru/3.16/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.16/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.16/library/dis.html#opcode-MAP_ADD), когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.667668#### `RETURN_VALUE`669670Возвращает `STACK[-1]` вызывающей стороне функции.671672#### `YIELD_VALUE`673674Производит `STACK.pop()` из [генератора](https://python-all.ru/3.16/glossary.html#term-generator).675676Изменено в версии 3.11: oparg теперь равен глубине стека.677678Изменено в версии 3.12: oparg теперь равен глубине блока исключений для эффективного закрытия генераторов.679680Изменено в версии 3.13: oparg равен `1`, если эта инструкция является частью yield-from или await, и `0` в противном случае.681682#### `SETUP_ANNOTATIONS`683684Проверяет, определён ли `__annotations__` в `locals()`; если нет, он устанавливается в пустой `dict`. Этот опкод генерируется, только если тело класса или модуля статически содержит [аннотации переменных](https://python-all.ru/3.16/glossary.html#term-variable-annotation).685686Добавлено в версии 3.6.687688#### `POP_EXCEPT`689690Извлекает значение из стека, которое используется для восстановления состояния исключения.691692Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.693694#### `RERAISE`695696Повторно возбуждает исключение, находящееся на вершине стека. Если oparg не равен нулю, извлекает из стека дополнительное значение, которое используется для установки [`f_lasti`](https://python-all.ru/3.16/reference/datamodel.html#frame.f_lasti) текущего фрейма.697698Добавлено в версии 3.9.699700Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.701702#### `PUSH_EXC_INFO`703704Извлекает значение из стека. Помещает текущее исключение на вершину стека. Возвращает обратно в стек то значение, которое было извлечено. Используется в обработчиках исключений.705706Добавлено в версии 3.12.707708#### `CHECK_EXC_MATCH`709710Выполняет сопоставление исключений для `except`. Проверяет, является ли `STACK[-2]` исключением, соответствующим `STACK[-1]`. Извлекает `STACK[-1]` и помещает в стек логический результат проверки.711712Добавлено в версии 3.12.713714#### `CHECK_EG_MATCH`715716Выполняет сопоставление исключений для `except*`. Применяет `split(STACK[-1])` к gруппе исключений, представляющей `STACK[-2]`.717718В случае совпадения извлекает из стека два элемента и помещает несовпадающую подгруппу (`None` при полном совпадении), а затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип сопоставления) и помещает `None`.719720Добавлено в версии 3.12.721722#### `WITH_EXCEPT_START`723724Вызывает функцию, находящуюся на позиции 4 в стеке, с аргументами (type, val, tb), представляющими исключение на вершине стека. Используется для реализации вызова `context_manager.__exit__(*exc_info())`, когда исключение возникло в операторе [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with).725726Добавлено в версии 3.9.727728Изменено в версии 3.11: Функция `__exit__` теперь находится на позиции 4 в стеке, а не на 7. Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.729730#### `LOAD_COMMON_CONSTANT`731732Помещает в стек общую константу. Интерпретатор содержит жёстко заданный список констант, поддерживаемых этой инструкцией. Используется оператором [`assert`](https://python-all.ru/3.16/reference/simple_stmts.html#assert) для загрузки [`AssertionError`](https://python-all.ru/3.16/library/exceptions.html#AssertionError).733734Добавлено в версии 3.14.735736#### `LOAD_BUILD_CLASS`737738Помещает `builtins.__build_class__()` в стек. Затем она вызывается для создания класса.739740#### `GET_LEN`741742Выполняет `STACK.append(len(STACK[-1]))`. Используется в операторах [`match`](https://python-all.ru/3.16/reference/compound_stmts.html#match), где требуется сравнение со структурой шаблона.743744Добавлено в версии 3.10.745746#### `MATCH_MAPPING`747748Если `STACK[-1]` является экземпляром [`collections.abc.Mapping`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Mapping) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) в его [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags)), поместить `True` в стек. В противном случае поместить `False`.749750Добавлено в версии 3.10.751752#### `MATCH_SEQUENCE`753754Если `STACK[-1]` является экземпляром [`collections.abc.Sequence`](https://python-all.ru/3.16/library/collections.abc.html#collections.abc.Sequence) и *не* является экземпляром [`str`](https://python-all.ru/3.16/library/stdtypes.html#str)/[`bytes`](https://python-all.ru/3.16/library/stdtypes.html#bytes)/[`bytearray`](https://python-all.ru/3.16/library/stdtypes.html#bytearray) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.16/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) в его [`tp_flags`](https://python-all.ru/3.16/c-api/typeobj.html#c.PyTypeObject.tp_flags)), поместить `True` в стек. В противном случае поместить `False`.755756Добавлено в версии 3.10.757758#### `MATCH_KEYS`759760`STACK[-1]` – кортеж ключей отображения, а `STACK[-2]` – объект сопоставления. Если `STACK[-2]` содержит все ключи из `STACK[-1]`, поместить [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple), содержащий соответствующие значения. В противном случае поместить `None`.761762Добавлено в версии 3.10.763764Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (`True`) или неудачу (`False`).765766#### `STORE_NAME(namei)`767768Реализует `name = STACK.pop()`. *namei* – это индекс *имени* в атрибуте [`co_names`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_names) объекта [кода](https://python-all.ru/3.16/reference/datamodel.html#code-objects). Компилятор старается использовать [`STORE_FAST`](https://python-all.ru/3.16/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.16/library/dis.html#opcode-STORE_GLOBAL), если это возможно.769770#### `UNPACK_SEQUENCE(count)`771772Распаковывает `STACK[-1]` в *count* отдельных значений, которые помещаются в стек справа налево. Требуется, чтобы было ровно *count* значений.773774```python775assert(len(STACK[-1]) == count)776STACK.extend(STACK.pop()[:-count-1:-1])777```778779#### `UNPACK_EX(counts)`780781Реализует присваивание с целевым именем со звёздочкой: распаковывает итерируемый объект из `STACK[-1]` в отдельные значения, при этом общее количество значений может быть меньше, чем количество элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.782783Количество значений до и после спискового значения ограничено 255.784785Количество значений до спискового значения кодируется в аргументе опкода. Количество значений после списка, если таковые имеются, кодируется с помощью `EXTENDED_ARG`. Следовательно, аргумент можно рассматривать как двухбайтовое значение, где младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него.786787Извлечённые значения помещаются в стек справа налево, т.е. `a, *b, c = d` после выполнения будет храниться как `STACK.extend((a, b, c))`.788789#### `STORE_ATTR(namei)`790791Реализует:792793```python794obj = STACK.pop()795value = STACK.pop()796obj.name = value797```798799где *namei* – это индекс имени в [`co_names`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_names) [объекта кода](https://python-all.ru/3.16/reference/datamodel.html#code-objects).800801#### `STORE_GLOBAL(namei)`802803Работает как [`STORE_NAME`](https://python-all.ru/3.16/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.804805#### `LOAD_CONST(consti)`806807Помещает `co_consts[consti]` в стек.808809#### `LOAD_SMALL_INT(i)`810811Помещает целое число `i` в стек. `i` должно находиться в `range(256)`812813Добавлено в версии 3.14.814815#### `LOAD_NAME(namei)`816817Помещает значение, связанное с `co_names[namei]`, в стек. Имя ищется в locals, затем в globals, затем в builtins.818819#### `LOAD_LOCALS`820821Помещает ссылку на словарь locals в стек. Это используется для подготовки словарей пространств имён для [`LOAD_FROM_DICT_OR_DEREF`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_FROM_DICT_OR_DEREF) и [`LOAD_FROM_DICT_OR_GLOBALS`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_FROM_DICT_OR_GLOBALS).822823Добавлено в версии 3.12.824825#### `LOAD_FROM_DICT_OR_GLOBALS(i)`826827Извлекает отображение из стека и ищет значение для `co_names[namei]`. Если имя не найдено там, ищет его в globals, затем в builtins, аналогично [`LOAD_GLOBAL`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_GLOBAL). Это используется для загрузки глобальных переменных в [областях видимости аннотаций](https://python-all.ru/3.16/reference/executionmodel.html#annotation-scopes) внутри тел классов.828829Добавлено в версии 3.12.830831#### `BUILD_TEMPLATE`832833Создаёт новый экземпляр [`Template`](https://python-all.ru/3.16/library/string.templatelib.html#string.templatelib.Template) из кортежа строк и кортежа интерполяций и помещает результирующий объект в стек:834835```python836interpolations = STACK.pop()837strings = STACK.pop()838STACK.append(_build_template(strings, interpolations))839```840841Добавлено в версии 3.14.842843#### `BUILD_INTERPOLATION(format)`844845Создаёт новый экземпляр [`Interpolation`](https://python-all.ru/3.16/library/string.templatelib.html#string.templatelib.Interpolation) из значения и его исходного выражения и помещает результирующий объект в стек.846847Если нет преобразования или спецификации формата, `format` устанавливается в `2`.848849Если установлен младший бит `format`, это означает, что интерполяция содержит спецификацию формата.850851Если `format >> 2` не равно нулю, это означает, что интерполяция содержит преобразование. Значение `format >> 2` – это тип преобразования (`0` для отсутствия преобразования, `1` для `!s`, `2` для `!r`, `3` для `!a`):852853```python854conversion = format >> 2855if format & 1:856    format_spec = STACK.pop()857else:858    format_spec = None859expression = STACK.pop()860value = STACK.pop()861STACK.append(_build_interpolation(value, expression, conversion, format_spec))862```863864Добавлено в версии 3.14.865866#### `BUILD_TUPLE(count)`867868Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек:869870```python871if count == 0:872    value = ()873else:874    value = tuple(STACK[-count:])875    STACK = STACK[:-count]876877STACK.append(value)878```879880#### `BUILD_LIST(count)`881882Работает как [`BUILD_TUPLE`](https://python-all.ru/3.16/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.883884#### `BUILD_SET(count)`885886Работает как [`BUILD_TUPLE`](https://python-all.ru/3.16/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.887888#### `BUILD_MAP(count)`889890Помещает новый объект словаря в стек. Извлекает `2 * count` элементов так, чтобы словарь содержал *count* записей: `{..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}`.891892Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для *count* элементов.893894#### `BUILD_STRING(count)`895896Конкатенирует *count* строк из стека и помещает результирующую строку в стек.897898Добавлено в версии 3.6.899900#### `LIST_EXTEND(i)`901902Реализует:903904```python905seq = STACK.pop()906list.extend(STACK[-i], seq)907```908909Используется для построения списков.910911Добавлено в версии 3.9.912913#### `SET_UPDATE(i)`914915Реализует:916917```python918seq = STACK.pop()919set.update(STACK[-i], seq)920```921922Используется для построения множеств.923924Добавлено в версии 3.9.925926#### `DICT_UPDATE(i)`927928Реализует:929930```python931map = STACK.pop()932dict.update(STACK[-i], map)933```934935Используется для построения словарей.936937Добавлено в версии 3.9.938939#### `DICT_MERGE(i)`940941Как [`DICT_UPDATE`](https://python-all.ru/3.16/library/dis.html#opcode-DICT_UPDATE), но вызывает исключение для повторяющихся ключей.942943Добавлено в версии 3.9.944945#### `LOAD_ATTR(namei)`946947Если младший бит `namei` не установлен, это заменяет `STACK[-1]` на `getattr(STACK[-1], co_names[namei>>1])`.948949Если установлен младший бит `namei`, эта инструкция пытается загрузить метод с именем `co_names[namei>>1]` из объекта `STACK[-1]`. `STACK[-1]` извлекается. Этот байткод различает два случая: если `STACK[-1]` имеет метод с правильным именем, байткод помещает несвязанный метод и `STACK[-1]`. `STACK[-1]` будет использоваться как первый аргумент (`self`) при вызове [`CALL`](https://python-all.ru/3.16/library/dis.html#opcode-CALL) или [`CALL_KW`](https://python-all.ru/3.16/library/dis.html#opcode-CALL_KW) несвязанного метода. В противном случае помещаются `NULL` и объект, возвращённый поиском атрибута.950951Изменено в версии 3.12: Если установлен младший бит `namei`, то в стек перед атрибутом или несвязанным методом соответственно помещается `NULL` или `self`.952953#### `LOAD_SUPER_ATTR(namei)`954955Этот опкод реализует [`super()`](https://python-all.ru/3.16/library/functions.html#super) как в форме без аргументов, так и в форме с двумя аргументами (например, `super().method()`, `super().attr` и `super(cls, self).method()`, `super(cls, self).attr`).956957Он извлекает три значения из стека (сверху вниз):958959- `self`: первый аргумент текущего метода960- `cls`: класс, в котором определён текущий метод961- глобальная `super`962963По отношению к своему аргументу работает аналогично [`LOAD_ATTR`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_ATTR), за исключением того, что `namei` сдвигается влево на 2 бита, а не на 1.964965Младший бит `namei` указывает на попытку загрузки метода, как и [`LOAD_ATTR`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_ATTR), что приводит к помещению в стек `NULL` и загруженного метода. Если бит сброшен, в стек помещается одно значение.966967Второй бит снизу `namei`, если установлен, означает, что это был вызов [`super()`](https://python-all.ru/3.16/library/functions.html#super) с двумя аргументами (сброшен означает вызов без аргументов).968969Добавлено в версии 3.12.970971#### `COMPARE_OP(opname)`972973Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname >> 5]`. Если установлен пятый бит снизу `opname` (`opname & 16`), результат должен быть приведён к `bool`.974975Изменено в версии 3.13: Пятый бит снизу аргумента oparg теперь указывает на принудительное преобразование в [`bool`](https://python-all.ru/3.16/library/functions.html#bool).976977#### `IS_OP(invert)`978979Выполняет сравнение `is` или `is not`, если `invert` равно 1.980981Добавлено в версии 3.9.982983#### `CONTAINS_OP(invert)`984985Выполняет сравнение `in` или `not in`, если `invert` равно 1.986987Добавлено в версии 3.9.988989#### `IMPORT_NAME(namei)`990991Импортирует модуль `co_names[namei]`. `STACK[-1]` и `STACK[-2]` извлекаются из стека и предоставляют аргументы *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.16/library/functions.html#import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректного оператора import последующая инструкция [`STORE_FAST`](https://python-all.ru/3.16/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.992993#### `IMPORT_FROM(namei)`994995Загружает атрибут `co_names[namei]` из модуля, находящегося в `STACK[-1]`. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.16/library/dis.html#opcode-STORE_FAST).996997#### `JUMP_FORWARD(delta)`998999Увеличивает счётчик байт-кода на *delta*.10001001#### `JUMP_BACKWARD(delta)`10021003Уменьшает счётчик байт-кода на *delta*. Проверяет прерывания.10041005Добавлено в версии 3.12.10061007#### `JUMP_BACKWARD_NO_INTERRUPT(delta)`10081009Уменьшает счётчик байт-кода на *delta*. Не проверяет прерывания.10101011Добавлено в версии 3.12.10121013#### `POP_JUMP_IF_TRUE(delta)`10141015Если `STACK[-1]` истинно, увеличивает счётчик байт-кода на *delta*. `STACK[-1]` извлекается из стека.10161017Изменено в версии 3.11: Аргумент oparg теперь является относительным смещением, а не абсолютным адресом. Этот код операции – псевдоинструкция, заменяемая в окончательном байт-коде на направленные версии (вперёд/назад).10181019Изменено в версии 3.12: Эта инструкция больше не является псевдо-инструкцией.10201021Изменено в версии 3.13: Теперь для этой инструкции требуется точный операнд [`bool`](https://python-all.ru/3.16/library/functions.html#bool).10221023#### `POP_JUMP_IF_FALSE(delta)`10241025Если `STACK[-1]` ложно, увеличивает счётчик байт-кода на *delta*. `STACK[-1]` извлекается из стека.10261027Изменено в версии 3.11: Аргумент oparg теперь является относительным смещением, а не абсолютным адресом. Этот код операции – псевдоинструкция, заменяемая в окончательном байт-коде на направленные версии (вперёд/назад).10281029Изменено в версии 3.12: Эта инструкция больше не является псевдо-инструкцией.10301031Изменено в версии 3.13: Теперь для этой инструкции требуется точный операнд [`bool`](https://python-all.ru/3.16/library/functions.html#bool).10321033#### `POP_JUMP_IF_NOT_NONE(delta)`10341035Если `STACK[-1]` не равно `None`, увеличивает счётчик байткода на *delta*. `STACK[-1]` извлекается из стека.10361037Добавлено в версии 3.12.10381039Изменено в версии 3.12: Эта инструкция больше не является псевдо-инструкцией.10401041#### `POP_JUMP_IF_NONE(delta)`10421043Если `STACK[-1]` равно `None`, увеличивает счётчик байткода на *delta*. `STACK[-1]` извлекается из стека.10441045Добавлено в версии 3.12.10461047Изменено в версии 3.12: Эта инструкция больше не является псевдо-инструкцией.10481049#### `FOR_ITER(delta)`10501051`STACK[-1]` – это [итератор](https://python-all.ru/3.16/glossary.html#term-iterator). Вызовите его метод [`__next__()`](https://python-all.ru/3.16/library/stdtypes.html#iterator.__next__). Если он возвращает новое значение, поместите его в стек (оставляя итератор под ним). Если итератор сообщает, что он исчерпан, то счётчик байткода увеличивается на *delta*.10521053Изменено в версии 3.12: До версии 3.11 итератор извлекался из стека, когда он исчерпывался.10541055#### `LOAD_GLOBAL(namei)`10561057Загружает глобальную переменную `co_names[namei>>1]` в стек.10581059Изменено в версии 3.11: Если младший бит `namei` установлен, то `NULL` помещается в стек перед глобальной переменной.10601061#### `LOAD_FAST(var_num)`10621063Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.10641065Изменено в версии 3.12: Теперь этот опкод используется только в ситуациях, где локальная переменная гарантированно инициализирована. Он не может вызвать [`UnboundLocalError`](https://python-all.ru/3.16/library/exceptions.html#UnboundLocalError).10661067#### `LOAD_FAST_BORROW(var_num)`10681069Помещает заимствованную ссылку на локальную переменную `co_varnames[var_num]` в стек.10701071Добавлено в версии 3.14.10721073#### `LOAD_FAST_LOAD_FAST(var_nums)`10741075Помещает ссылки на `co_varnames[var_nums >> 4]` и `co_varnames[var_nums & 15]` в стек.10761077Добавлено в версии 3.13.10781079#### `LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)`10801081Помещает заимствованные ссылки на `co_varnames[var_nums >> 4]` и `co_varnames[var_nums & 15]` в стек.10821083Добавлено в версии 3.14.10841085#### `LOAD_FAST_CHECK(var_num)`10861087Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек, вызывая [`UnboundLocalError`](https://python-all.ru/3.16/library/exceptions.html#UnboundLocalError), если локальная переменная не была инициализирована.10881089Добавлено в версии 3.12.10901091#### `LOAD_FAST_AND_CLEAR(var_num)`10921093Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек (или помещает `NULL` в стек, если локальная переменная не была инициализирована) и устанавливает `co_varnames[var_num]` в `NULL`.10941095Добавлено в версии 3.12.10961097#### `STORE_FAST(var_num)`10981099Сохраняет `STACK.pop()` в локальную переменную `co_varnames[var_num]`.11001101#### `STORE_FAST_STORE_FAST(var_nums)`11021103Сохраняет `STACK[-1]` в `co_varnames[var_nums >> 4]` и `STACK[-2]` в `co_varnames[var_nums & 15]`.11041105Добавлено в версии 3.13.11061107#### `STORE_FAST_LOAD_FAST(var_nums)`11081109Сохраняет `STACK.pop()` в локальную переменную `co_varnames[var_nums >> 4]` и помещает ссылку на локальную переменную `co_varnames[var_nums & 15]` в стек.11101111Добавлено в версии 3.13.11121113#### `DELETE_FAST(var_num)`11141115Удаляет локальную переменную `co_varnames[var_num]`.11161117#### `MAKE_CELL(i)`11181119Создаёт новую ячейку в слоте `i`. Если этот слот не пуст, то это значение сохраняется в новую ячейку.11201121Добавлено в версии 3.12.11221123#### `LOAD_DEREF(i)`11241125Загружает ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных». Помещает в стек ссылку на объект, содержащийся в этой ячейке.11261127Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_varnames).11281129#### `LOAD_FROM_DICT_OR_DEREF(i)`11301131Извлекает отображение из стека и ищет имя, связанное со слотом `i` хранилища «быстрых локальных переменных», в этом отображении. Если имя не найдено, загружает его из ячейки, находящейся в слоте `i`, аналогично [`LOAD_DEREF`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_DEREF). Используется для загрузки [переменных замыкания](https://python-all.ru/3.16/glossary.html#term-closure-variable) в телах классов (ранее для этого использовалась `LOAD_CLASSDEREF`) и в [областях аннотаций](https://python-all.ru/3.16/reference/executionmodel.html#annotation-scopes) внутри тел классов.11321133Добавлено в версии 3.12.11341135#### `STORE_DEREF(i)`11361137Сохраняет `STACK.pop()` в ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных».11381139Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_varnames).11401141#### `DELETE_DEREF(i)`11421143Очищает ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных». Используется оператором [`del`](https://python-all.ru/3.16/reference/simple_stmts.html#del).11441145Добавлено в версии 3.2.11461147Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.16/reference/datamodel.html#codeobject.co_varnames).11481149#### `COPY_FREE_VARS(n)`11501151Копирует `n` [свободных (замыкающих) переменных](https://python-all.ru/3.16/glossary.html#term-closure-variable) из замыкания во фрейм. Устраняет необходимость в специальном коде на стороне вызывающего при вызове замыканий.11521153Добавлено в версии 3.12.11541155#### `RAISE_VARARGS(argc)`11561157Вызывает исключение, используя одну из трёх форм оператора `raise`, в зависимости от значения *argc*:11581159- 0: `raise` (повторный вызов предыдущего исключения)1160- 1: `raise STACK[-1]` (вызов экземпляра или типа исключения по адресу `STACK[-1]`)1161- 2: `raise STACK[-2] from STACK[-1]` (вызов экземпляра или типа исключения по адресу `STACK[-2]` с `__cause__`, установленным в `STACK[-1]`)11621163#### `CALL(argc)`11641165Вызывает вызываемый объект с количеством аргументов, указанным `argc`. В стеке находятся (в порядке возрастания):11661167- Вызываемый объект1168- `self` или `NULL`1169- Оставшиеся позиционные аргументы11701171`argc` – это общее количество позиционных аргументов, исключая `self`.11721173`CALL` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом.11741175Добавлено в версии 3.12.11761177Изменено в версии 3.13: Вызываемый объект теперь всегда находится на одной и той же позиции в стеке.11781179Изменено в версии 3.13: Вызовы с именованными аргументами теперь обрабатываются [`CALL_KW`](https://python-all.ru/3.16/library/dis.html#opcode-CALL_KW).11801181#### `CALL_KW(argc)`11821183Вызывает вызываемый объект с количеством аргументов, указанным `argc`, включая один или несколько именованных аргументов. В стеке находятся (в порядке возрастания):11841185- Вызываемый объект1186- `self` или `NULL`1187- Оставшиеся позиционные аргументы1188- Именованные аргументы1189- [`tuple`](https://python-all.ru/3.16/library/stdtypes.html#tuple) имён именованных аргументов11901191`argc` – это общее количество позиционных и именованных аргументов, исключая `self`. Длина кортежа имён именованных аргументов равна количеству именованных аргументов.11921193`CALL_KW` извлекает из стека все аргументы, имена ключевых слов и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.11941195Добавлено в версии 3.13.11961197#### `CALL_FUNCTION_EX(flags)`11981199Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит *flags*, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. `CALL_FUNCTION_EX` извлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.12001201Добавлено в версии 3.6.12021203#### `PUSH_NULL`12041205Помещает `NULL` в стек. Используется в последовательности вызова для сопоставления с `NULL`, помещённым [`LOAD_ATTR`](https://python-all.ru/3.16/library/dis.html#opcode-LOAD_ATTR) для вызовов не-методов.12061207Добавлено в версии 3.12.12081209#### `MAKE_FUNCTION`12101211Помещает в стек новый объект функции, построенный из объекта кода по адресу `STACK[-1]`.12121213Изменено в версии 3.10: Значение флага `0x04` теперь является кортежем строк вместо словаря12141215Изменено в версии 3.11: Квалифицированное имя по адресу `STACK[-1]` удалено.12161217Изменено в версии 3.13: Дополнительные атрибуты функции в стеке, обозначаемые флагами oparg, были удалены. Теперь они используют [`SET_FUNCTION_ATTRIBUTE`](https://python-all.ru/3.16/library/dis.html#opcode-SET_FUNCTION_ATTRIBUTE).12181219#### `SET_FUNCTION_ATTRIBUTE(flag)`12201221Устанавливает атрибут объекта функции. Ожидает функцию на `STACK[-1]` и значение атрибута для установки на `STACK[-2]`; потребляет оба и оставляет функцию на `STACK[-1]`. Флаг определяет, какой атрибут устанавливать:12221223- `0x01` кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке1224- `0x02` словарь значений по умолчанию только-именованных параметров1225- `0x04` кортеж строк, содержащих аннотации параметров1226- `0x08` кортеж, содержащий ячейки для свободных переменных, образующий замыкание1227- `0x10` [функция annotate](https://python-all.ru/3.16/glossary.html#term-annotate-function) для объекта функции12281229Добавлено в версии 3.13.12301231Изменено в версии 3.14: Добавлен `0x10` для указания функции annotate для объекта функции.12321233#### `BUILD_SLICE(argc)`12341235Помещает объект среза в стек. *argc* должно быть 2 или 3. Если равно 2, реализует:12361237```python1238end = STACK.pop()1239start = STACK.pop()1240STACK.append(slice(start, end))1241```12421243если равно 3, реализует:12441245```python1246step = STACK.pop()1247end = STACK.pop()1248start = STACK.pop()1249STACK.append(slice(start, end, step))1250```12511252Смотрите встроенную функцию [`slice()`](https://python-all.ru/3.16/library/functions.html#slice) для получения дополнительной информации.12531254#### `EXTENDED_ARG(ext)`12551256Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. *ext* содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов `EXTENDED_ARG`, формирующих аргумент от двух до четырёх байт.12571258#### `CONVERT_VALUE(oparg)`12591260Преобразует значение в строку в зависимости от `oparg`:12611262```python1263value = STACK.pop()1264result = func(value)1265STACK.append(result)1266```12671268- `oparg == 1`: вызов [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str) для *значения*1269- `oparg == 2`: вызов [`repr()`](https://python-all.ru/3.16/library/functions.html#repr) для *значения*1270- `oparg == 3`: вызов [`ascii()`](https://python-all.ru/3.16/library/functions.html#ascii) для *значения*12711272Используется для реализации форматированных строковых литералов (f-строк).12731274Добавлено в версии 3.13.12751276#### `FORMAT_SIMPLE`12771278Форматирует значение на вершине стека:12791280```python1281value = STACK.pop()1282result = value.__format__("")1283STACK.append(result)1284```12851286Используется для реализации форматированных строковых литералов (f-строк).12871288Добавлено в версии 3.13.12891290#### `FORMAT_WITH_SPEC`12911292Форматирует заданное значение по заданному спецификатору формата:12931294```python1295spec = STACK.pop()1296value = STACK.pop()1297result = value.__format__(spec)1298STACK.append(result)1299```13001301Используется для реализации форматированных строковых литералов (f-строк).13021303Добавлено в версии 3.13.13041305#### `MATCH_CLASS(count)`13061307`STACK[-1]` – это кортеж имен ключевых атрибутов, `STACK[-2]` – класс, с которым производится сопоставление, а `STACK[-3]` – объект сопоставления. *count* – это количество позиционных подшаблонов.13081309Извлечь `STACK[-1]`, `STACK[-2]` и `STACK[-3]`. Если `STACK[-3]` является экземпляром `STACK[-2]` и имеет позиционные и ключевые атрибуты, требуемые *count* и `STACK[-1]`, поместить в стек кортеж извлеченных атрибутов. В противном случае поместить `None`.13101311Добавлено в версии 3.10.13121313Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (`True`) или неудачу (`False`).13141315#### `RESUME(context)`13161317Пустая операция. Выполняет внутренние проверки трассировки, отладки и оптимизации.13181319Операнд `context` состоит из двух частей. Два младших бита указывают, где происходит `RESUME`:13201321- `0` Начало функции, которая не является ни генератором, корутиной, ни асинхронным генератором1322- `1` После выражения `yield`1323- `2` После выражения `yield from`1324- `3` После выражения `await`13251326Следующий бит равен `1`, если RESUME находится на глубине исключения `1`, и `0` в противном случае.13271328Добавлено в версии 3.12.13291330Изменено в версии 3.13: Значение oparg было изменено, чтобы включать информацию о глубине исключения13311332#### `RETURN_GENERATOR`13331334Создает генератор, корутину или асинхронный генератор из текущего фрейма. Используется как первая опкода в объекте кода для указанных вызываемых объектов. Очищает текущий фрейм и возвращает вновь созданный генератор.13351336Добавлено в версии 3.12.13371338#### `SEND(delta)`13391340Эквивалентно `STACK[-1] = STACK[-2].send(STACK[-1])`. Используется в операторах `yield from` и `await`.13411342Если вызов вызывает исключение [`StopIteration`](https://python-all.ru/3.16/library/exceptions.html#StopIteration), извлечь верхнее значение из стека, поместить атрибут `value` исключения и увеличить счетчик байт-кода на *delta*.13431344Добавлено в версии 3.12.13451346#### `HAVE_ARGUMENT`13471348Это на самом деле не опкод. Он определяет границу между опкодами в диапазоне \[0,255\], которые не используют свой аргумент, и теми, которые используют (соответственно `< HAVE_ARGUMENT` и `>= HAVE_ARGUMENT`).13491350Если ваше приложение использует псевдоинструкции или специализированные инструкции, вместо этого используйте коллекцию [`hasarg`](https://python-all.ru/3.16/library/dis.html#dis.hasarg).13511352Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды `< HAVE_ARGUMENT` игнорируют его. Раньше аргумент был только у опкодов `>= HAVE_ARGUMENT`.13531354Изменено в версии 3.12: Псевдоинструкции были добавлены в модуль `dis`, и для них неверно, что сравнение с `HAVE_ARGUMENT` указывает, используют ли они свой аргумент.13551356Устарело с версии 3.13: Используйте [`hasarg`](https://python-all.ru/3.16/library/dis.html#dis.hasarg) вместо этого.13571358#### `CALL_INTRINSIC_1`13591360Вызывает встроенную функцию с одним аргументом. Передаёт `STACK[-1]` в качестве аргумента и записывает результат в `STACK[-1]`. Используется для реализации функциональности, не критичной к производительности.13611362Операнд определяет, какая встроенная функция вызывается:13631364| Операнд | Описание |1365| --- | --- |1366| `INTRINSIC_1_INVALID` | Недействительно |1367| `INTRINSIC_PRINT` | Выводит аргумент в стандартный вывод. Используется в REPL. |1368| `INTRINSIC_IMPORT_STAR` | Выполняет `import *` для указанного модуля. |1369| `INTRINSIC_STOPITERATION_ERROR` | Извлекает возвращаемое значение из исключения `StopIteration`. |1370| `INTRINSIC_ASYNC_GEN_WRAP` | Оборачивает значение асинхронного генератора |1371| `INTRINSIC_UNARY_POSITIVE` | Выполняет унарную операцию `+` |1372| `INTRINSIC_LIST_TO_TUPLE` | Преобразует список в кортеж |1373| `INTRINSIC_TYPEVAR` | Создаёт [`typing.TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar) |1374| `INTRINSIC_PARAMSPEC` | Создаёт [`typing.ParamSpec`](https://python-all.ru/3.16/library/typing.html#typing.ParamSpec) |1375| `INTRINSIC_TYPEVARTUPLE` | Создаёт [`typing.TypeVarTuple`](https://python-all.ru/3.16/library/typing.html#typing.TypeVarTuple) |1376| `INTRINSIC_SUBSCRIPT_GENERIC` | Возвращает [`typing.Generic`](https://python-all.ru/3.16/library/typing.html#typing.Generic), индексированный аргументом |1377| `INTRINSIC_TYPEALIAS` | Создаёт [`typing.TypeAliasType`](https://python-all.ru/3.16/library/typing.html#typing.TypeAliasType); используется в операторе [`type`](https://python-all.ru/3.16/reference/simple_stmts.html#type). Аргумент – кортеж из имени псевдонима типа, параметров типа и значения. |13781379Добавлено в версии 3.12.13801381#### `CALL_INTRINSIC_2`13821383Вызывает встроенную функцию с двумя аргументами. Используется для реализации функциональности, не критичной к производительности:13841385```python1386arg2 = STACK.pop()1387arg1 = STACK.pop()1388result = intrinsic2(arg1, arg2)1389STACK.append(result)1390```13911392Операнд определяет, какая встроенная функция вызывается:13931394| Операнд | Описание |1395| --- | --- |1396| `INTRINSIC_2_INVALID` | Недействительно |1397| `INTRINSIC_PREP_RERAISE_STAR` | Вычисляет [`ExceptionGroup`](https://python-all.ru/3.16/library/exceptions.html#ExceptionGroup), которое нужно возбудить из `try-except*`. |1398| `INTRINSIC_TYPEVAR_WITH_BOUND` | Создаёт [`typing.TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar) с границей. |1399| `INTRINSIC_TYPEVAR_WITH_CONSTRAINTS` | Создаёт [`typing.TypeVar`](https://python-all.ru/3.16/library/typing.html#typing.TypeVar) с ограничениями. |1400| `INTRINSIC_SET_FUNCTION_TYPE_PARAMS` | Устанавливает атрибут `__type_params__` функции. |14011402Добавлено в версии 3.12.14031404#### `LOAD_SPECIAL`14051406Выполняет поиск специального метода в `STACK[-1]`. Если `type(STACK[-1]).__xxx__` является методом, оставляет `type(STACK[-1]).__xxx__; STACK[-1]` на стеке. Если `type(STACK[-1]).__xxx__` не является методом, оставляет `STACK[-1].__xxx__; NULL` на стеке.14071408Добавлено в версии 3.14.14091410**Псевдоинструкции**14111412Эти опкоды не встречаются в байткоде Python. Они используются компилятором, но заменяются реальными опкодами или удаляются до генерации байткода.14131414#### `SETUP_FINALLY(target)`14151416Настраивает обработчик исключений для следующего блока кода. Если возникает исключение, уровень стека значений восстанавливается до текущего состояния, и управление передаётся обработчику исключений по адресу `target`.14171418#### `SETUP_CLEANUP(target)`14191420Как `SETUP_FINALLY`, но в случае исключения также помещает последнюю инструкцию (`lasti`) в стек, чтобы `RERAISE` могла её восстановить. Если возникает исключение, уровень стека значений и последняя инструкция на фрейме восстанавливаются до текущего состояния, и управление передаётся обработчику исключений по адресу `target`.14211422#### `SETUP_WITH(target)`14231424Подобно `SETUP_CLEANUP`, но в случае исключения из стека извлекается ещё один элемент перед передачей управления обработчику исключений по адресу `target`.14251426Этот вариант используется в конструкциях [`with`](https://python-all.ru/3.16/reference/compound_stmts.html#with) и [`async with`](https://python-all.ru/3.16/reference/compound_stmts.html#async-with), которые помещают возвращаемое значение [`__enter__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__enter__) или [`__aenter__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__aenter__) менеджера контекста в стек.14271428#### `POP_BLOCK`14291430Отмечает конец блока кода, связанного с последним `SETUP_FINALLY`, `SETUP_CLEANUP` или `SETUP_WITH`.14311432#### `JUMP`14331434#### `JUMP_NO_INTERRUPT`14351436Ненаправленные инструкции относительного перехода, которые заменяются ассемблером на их направленные (вперёд/назад) аналоги.14371438#### `JUMP_IF_TRUE`14391440#### `JUMP_IF_FALSE`14411442Условные переходы, не влияющие на стек. Заменяются последовательностью `COPY 1`, `TO_BOOL`, `POP_JUMP_IF_TRUE/FALSE`.14431444#### `LOAD_CLOSURE(i)`14451446Помещает ссылку на ячейку, содержащуюся в слоте `i` хранилища «быстрых локальных переменных».14471448Обратите внимание, что в ассемблере `LOAD_CLOSURE` заменяется на `LOAD_FAST`.14491450Изменено в версии 3.13: Теперь этот опкод является псевдоинструкцией.14511452## Коллекции опкодов14531454Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:14551456Изменено в версии 3.12: Теперь коллекции содержат также псевдоинструкции и инструментированные инструкции. Это опкоды со значениями `>= MIN_PSEUDO_OPCODE` и `>= MIN_INSTRUMENTED_OPCODE`.14571458#### `dis.opname`14591460Последовательность имён операций, индексируемая с помощью байткода.14611462#### `dis.opmap`14631464Словарь, сопоставляющий имена операций с байткодами.14651466#### `dis.cmp_op`14671468Последовательность всех имён операций сравнения.14691470#### `dis.hasarg`14711472Последовательность байткодов, использующих свой аргумент.14731474Добавлено в версии 3.12.14751476#### `dis.hasconst`14771478Последовательность байткодов, обращающихся к константе.14791480#### `dis.hasfree`14811482Последовательность байткодов, обращающихся к [свободной (замыкающей) переменной](https://python-all.ru/3.16/glossary.html#term-closure-variable). Термин «свободная» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области, или к именам во внешних областях, на которые ссылаются из этой области. Он *не* включает ссылки на глобальные или встроенные области.14831484#### `dis.hasname`14851486Последовательность байткодов, обращающихся к атрибуту по имени.14871488#### `dis.hasjump`14891490Последовательность байткодов, имеющих цель перехода. Все переходы относительные.14911492Добавлено в версии 3.13.14931494#### `dis.haslocal`14951496Последовательность байткодов, обращающихся к локальной переменной.14971498#### `dis.hascompare`14991500Последовательность байткодов логических операций.15011502#### `dis.hasexc`15031504Последовательность байткодов, устанавливающих обработчик исключений.15051506Добавлено в версии 3.12.15071508#### `dis.hasjrel`15091510Последовательность байткодов, имеющих относительную цель перехода.15111512Deprecated since version 3.13: All jumps are now relative. Use [`hasjump`](https://python-all.ru/3.16/library/dis.html#dis.hasjump).15131514#### `dis.hasjabs`15151516Последовательность байткодов, имеющих абсолютную цель перехода.15171518Устарело с версии 3.13: Все переходы теперь относительные. Этот список пуст.1519