dis.md
1> **Источник:** https://python-all.ru/3.11/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`dis`](https://python-all.ru/3.11/library/dis.html#module-dis) – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.11/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.11/library/dis.html#module-dis) поддерживает анализ [байт-кода](https://python-all.ru/3.11/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.11/library/dis.html#opcode-CACHE). Эти инструкции по умолчанию скрыты, но их можно показать, передав `show_caches=True` любой [`dis`](https://python-all.ru/3.11/library/dis.html#module-dis) утилите. Кроме того, интерпретатор теперь адаптирует байт-код для специализации под разные условия выполнения. Адаптивный байт-код можно показать, передав `adaptive=True`.2223Пример: Дана функция `myfunc()`:2425```python26def myfunc(alist):27 return len(alist)28```2930следующую команду можно использовать для отображения дизассемблирования `myfunc()`:3132```pycon33>>> dis.dis(myfunc)34 2 0 RESUME 03536 3 2 LOAD_GLOBAL 1 (NULL + len)37 14 LOAD_FAST 0 (alist)38 16 PRECALL 139 20 CALL 140 30 RETURN_VALUE41```4243(«2» – это номер строки).4445## Интерфейс командной строки4647Модуль [`dis`](https://python-all.ru/3.11/library/dis.html#module-dis) можно вызвать как сценарий из командной строки:4849```sh50python -m dis [-h] [-C] [infile]51```5253Принимаются следующие опции:5455#### `-h, --help`5657Показать справку и выйти.5859#### `-C, --show-caches`6061Показать встроенные кэши.6263Если указан `infile`, его дизассемблированный код выводится в stdout. В противном случае дизассемблирование выполняется для скомпилированного исходного кода, полученного из stdin.6465## Анализ байт-кода6667Новое в версии 3.4.6869API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode), который предоставляет удобный доступ к деталям скомпилированного кода.7071#### `class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False)`7273Анализирует байткод, соответствующий функции, генератору, асинхронному генератору, корутине, методу, строке исходного кода или объекту кода (как возвращается [`compile()`](https://python-all.ru/3.11/library/functions.html#compile)).7475Это удобная обёртка над многими функциями, перечисленными ниже, особенно [`get_instructions()`](https://python-all.ru/3.11/library/dis.html#dis.get_instructions), поскольку итерация по экземпляру [`Bytecode`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode) возвращает операции байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.11/library/dis.html#dis.Instruction).7677Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.7879Если *current\_offset* не равно `None`, оно указывает смещение инструкции в дизассемблированном коде. Установка этого значения означает, что [`dis()`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode.dis) будет отображать маркер «текущая инструкция» напротив указанной операции.8081Если *show\_caches* равно `True`, [`dis()`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode.dis) будет отображать записи inline-кэша, используемые интерпретатором для специализации байткода.8283Если *adaptive* равно `True`, [`dis()`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode.dis) будет отображать специализированный байткод, который может отличаться от исходного.8485#### `classmethod from_traceback(tb, *, show_caches=False)`8687Создаёт экземпляр [`Bytecode`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode) из заданного traceback, устанавливая *current\_offset* на инструкцию, ответственную за исключение.8889#### `codeobj`9091Скомпилированный объект кода.9293#### `first_line`9495Первая строка исходного кода объекта кода (если доступна)9697#### `dis()`9899Возвращает форматированное представление операций байткода (то же, что выводится [`dis.dis()`](https://python-all.ru/3.11/library/dis.html#dis.dis), но возвращается в виде многострочной строки).100101#### `info()`102103Возвращает форматированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.11/library/dis.html#dis.code_info).104105Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.106107Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.108109Пример:110111```pycon112>>> bytecode = dis.Bytecode(myfunc)113>>> for instr in bytecode:114... print(instr.opname)115...116RESUME117LOAD_GLOBAL118LOAD_FAST119PRECALL120CALL121RETURN_VALUE122```123124## Функции анализа125126Модуль [`dis`](https://python-all.ru/3.11/library/dis.html#module-dis) также определяет следующие функции анализа, которые преобразуют входные данные непосредственно в желаемый вывод. Они могут быть полезны, если выполняется только одна операция, и промежуточный объект анализа не нужен:127128#### `dis.code_info(x)`129130Возвращает форматированную многострочную строку с подробной информацией об объекте кода для указанной функции, генератора, асинхронного генератора, корутины, метода, строки исходного кода или объекта кода.131132Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.133134Новое в версии 3.2.135136Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.137138#### `dis.show_code(x, *, file=None)`139140Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или `sys.stdout`, если *file* не указан).141142Это удобная краткая форма для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.143144Новое в версии 3.2.145146Изменено в версии 3.4: Добавлен параметр *file*.147148#### `dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False)`149150Дизассемблирует объект *x*. *x* может быть модулем, классом, методом, функцией, генератором, асинхронным генератором, корутиной, объектом кода, строкой исходного кода или последовательностью байт сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы (включая методы класса и статические методы). Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Также рекурсивно дизассемблируются вложенные объекты кода (код включений, генераторных выражений и вложенных функций, а также код, используемый для построения вложенных классов). Строки сначала компилируются в объекты кода с помощью встроенной функции [`compile()`](https://python-all.ru/3.11/library/functions.html#compile), а затем дизассемблируются. Если объект не указан, эта функция дизассемблирует последнюю трассировку.151152Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.153154Максимальная глубина рекурсии ограничивается параметром *depth*, если только он не равен `None`. `depth=0` означает отсутствие рекурсии.155156Если *show\_caches* равен `True`, функция будет показывать записи инлайн-кэша, которые интерпретатор использует для специализации байткода.157158Если *adaptive* равен `True`, функция будет показывать специализированный байткод, который может отличаться от исходного.159160Изменено в версии 3.4: Добавлен параметр *file*.161162Изменено в версии 3.7: Реализовано рекурсивное дисассемблирование и добавлен параметр *depth*.163164Изменено в версии 3.7: Теперь может обрабатывать объекты корутин и асинхронных генераторов.165166Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.167168#### `dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False)`169170Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.171172Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.173174Изменено в версии 3.4: Добавлен параметр *file*.175176Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.177178#### `dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)`179180#### `dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)`181182Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:1831841. номер строки для первой инструкции каждой строки1852. текущая инструкция, помечена как `-->`,1863. инструкция с меткой, помечена `>>`,1874. адрес инструкции,1885. название кода операции,1896. параметры операции и1907. интерпретация параметров в скобках.191192Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.193194Результат дисассемблирования выводится в виде текста в указанный аргумент *file*, если он передан, иначе – в `sys.stdout`.195196Изменено в версии 3.4: Добавлен параметр *file*.197198Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.199200#### `dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)`201202Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.203204Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.11/library/dis.html#dis.Instruction), содержащих сведения о каждой операции в переданном коде.205206Если *first\_line* не равен `None`, он указывает номер строки, который должен быть указан для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строке исходного кода (если есть) берётся непосредственно из дизассемблированного объекта кода.207208Параметры *show\_caches* и *adaptive* работают так же, как и в [`dis()`](https://python-all.ru/3.11/library/dis.html#module-dis).209210Новое в версии 3.4.211212Изменено в версии 3.11: Добавлены параметры *show\_caches* и *adaptive*.213214#### `dis.findlinestarts(code)`215216Эта функция-генератор использует метод [`co_lines()`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_lines) [объекта кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects) *code* для поиска смещений, которые являются началами строк в исходном коде. Они генерируются в виде пар `(offset, lineno)`.217218Изменено в версии 3.6: Номера строк могут уменьшаться. Раньше они всегда увеличивались.219220Изменено в версии 3.10: Метод [**PEP 626**](https://python-all.ru/3.11/library/dis.html) [`co_lines()`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_lines) используется вместо атрибутов [`co_firstlineno`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_firstlineno) и [`co_lnotab`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_lnotab) [объекта кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects).221222#### `dis.findlabels(code)`223224Обнаруживает все смещения в сырой скомпилированной строке байткода *code*, которые являются целями переходов, и возвращает список этих смещений.225226#### `dis.stack_effect(opcode, oparg=None, *, jump=None)`227228Вычисляет эффект стека для *opcode* с аргументом *oparg*.229230Если код имеет цель перехода и *jump* равен `True`, [`stack_effect()`](https://python-all.ru/3.11/library/dis.html#dis.stack_effect) возвращает эффект стека при переходе. Если *jump* равен `False`, возвращается эффект стека при отсутствии перехода. А если *jump* равен `None` (по умолчанию), возвращается максимальный эффект стека для обоих случаев.231232Новое в версии 3.4.233234Изменено в версии 3.8: Добавлен параметр *jump*.235236## Инструкции байткода Python237238Функция [`get_instructions()`](https://python-all.ru/3.11/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.11/library/dis.html#dis.Bytecode) предоставляют сведения об инструкциях байткода в виде экземпляров [`Instruction`](https://python-all.ru/3.11/library/dis.html#dis.Instruction):239240#### `class dis.Instruction`241242Подробности об операции байткода243244#### `opcode`245246Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [коллекциях Opcode](https://python-all.ru/3.11/library/dis.html#opcode-collections).247248#### `opname`249250Человекочитаемое имя операции251252#### `arg`253254числовой аргумент операции (если есть), иначе `None`255256#### `argval`257258разрешённое значение аргумента (если есть), иначе `None`259260#### `argrepr`261262человекочитаемое описание аргумента операции (если есть), иначе пустая строка.263264#### `offset`265266начальный индекс операции в последовательности байт-кода267268#### `starts_line`269270Строка, с которой начинается данный опкод (если есть), иначе `None`.271272#### `is_jump_target`273274`True`, если другой код переходит сюда, иначе `False`275276#### `positions`277278объект [`dis.Positions`](https://python-all.ru/3.11/library/dis.html#dis.Positions), содержащий начальные и конечные позиции, которые охватываются этой инструкцией.279280Новое в версии 3.4.281282Изменено в версии 3.11: Добавлено поле `positions`.283284#### `class dis.Positions`285286Если информация недоступна, некоторые поля могут быть `None`.287288#### `lineno`289290#### `end_lineno`291292#### `col_offset`293294#### `end_col_offset`295296Новое в версии 3.11.297298В настоящее время компилятор Python генерирует следующие инструкции байткода.299300**Общие инструкции**301302#### `NOP`303304Код, который ничего не делает. Используется оптимизатором байткода как заполнитель, а также для генерации событий трассировки строк.305306#### `POP_TOP`307308Удаляет элемент с вершины стека (TOS).309310#### `COPY(i)`311312Помещает элемент с индексом *i* на вершину стека. Элемент не удаляется из своего исходного положения.313314Новое в версии 3.11.315316#### `SWAP(i)`317318Меняет местами TOS и элемент на позиции *i*.319320Новое в версии 3.11.321322#### `CACHE`323324Вместо того чтобы быть реальной инструкцией, этот опкод используется для разметки дополнительного пространства, чтобы интерпретатор мог кэшировать полезные данные непосредственно в байткоде. Он автоматически скрывается всеми утилитами `dis`, но может быть просмотрен с помощью `show_caches=True`.325326Логически это пространство является частью предыдущей инструкции. Многие опкоды ожидают, что за ними следует точное количество кэшей, и будут указывать интерпретатору пропускать их во время выполнения.327328Заполненные кэши могут выглядеть как произвольные инструкции, поэтому следует проявлять большую осторожность при чтении или изменении сырого адаптивного байткода, содержащего ускоренные данные.329330Новое в версии 3.11.331332**Унарные операции**333334Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.335336#### `UNARY_POSITIVE`337338Реализует `TOS = +TOS`.339340#### `UNARY_NEGATIVE`341342Реализует `TOS = -TOS`.343344#### `UNARY_NOT`345346Реализует `TOS = not TOS`.347348#### `UNARY_INVERT`349350Реализует `TOS = ~TOS`.351352#### `GET_ITER`353354Реализует `TOS = iter(TOS)`.355356#### `GET_YIELD_FROM_ITER`357358Если `TOS` является объектом [генераторный итератор](https://python-all.ru/3.11/glossary.html#term-generator-iterator) или [корутина](https://python-all.ru/3.11/glossary.html#term-coroutine), он остаётся без изменений. В противном случае реализует `TOS = iter(TOS)`.359360Новое в версии 3.5.361362**Бинарные операции и операции на месте**363364Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.365366Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.367368#### `BINARY_OP(op)`369370Реализует бинарные операторы и операторы на месте (в зависимости от значения *op*).371372Новое в версии 3.11.373374#### `BINARY_SUBSCR`375376Реализует `TOS = TOS1[TOS]`.377378#### `STORE_SUBSCR`379380Реализует `TOS1[TOS] = TOS2`.381382#### `DELETE_SUBSCR`383384Реализует `del TOS1[TOS]`.385386**Коды операций корутин**387388#### `GET_AWAITABLE(where)`389390Реализует `TOS = get_awaitable(TOS)`, где `get_awaitable(o)` возвращает `o`, если `o` является объектом корутины или объектом генератора с флагом CO\_ITERABLE\_COROUTINE, или разрешает `o.__await__`.391392> Если операнд `where` не равен нулю, он указывает, где находится инструкция :393>394> - `1` После вызова `__aenter__`395> - `2` После вызова `__aexit__`396397Новое в версии 3.5.398399Изменено в версии 3.11: Ранее эта инструкция не имела oparg.400401#### `GET_AITER`402403Реализует `TOS = TOS.__aiter__()`.404405Новое в версии 3.5.406407Изменено в версии 3.7: Возврат ожидаемых объектов из `__aiter__` больше не поддерживается.408409#### `GET_ANEXT`410411Помещает `get_awaitable(TOS.__anext__())` в стек. См. `GET_AWAITABLE` для подробностей о `get_awaitable`.412413Новое в версии 3.5.414415#### `END_ASYNC_FOR`416417Завершает цикл [`async for`](https://python-all.ru/3.11/reference/compound_stmts.html#async-for). Обрабатывает исключение, возникшее при ожидании следующего элемента. В стеке находятся асинхронный итерируемый объект в TOS1 и возникшее исключение в TOS. Оба извлекаются. Если исключение не является [`StopAsyncIteration`](https://python-all.ru/3.11/library/exceptions.html#StopAsyncIteration), оно возбуждается повторно.418419Новое в версии 3.8.420421Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.422423#### `BEFORE_ASYNC_WITH`424425Извлекает `__aenter__` и `__aexit__` из объекта на вершине стека. Помещает `__aexit__` и результат `__aenter__()` в стек.426427Новое в версии 3.5.428429**Прочие опкоды**430431#### `PRINT_EXPR`432433Реализует выражение-инструкцию для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме выражение-инструкция завершается с помощью [`POP_TOP`](https://python-all.ru/3.11/library/dis.html#opcode-POP_TOP).434435#### `SET_ADD(i)`436437Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).438439#### `LIST_APPEND(i)`440441Вызывает `list.append(TOS1[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).442443#### `MAP_ADD(i)`444445Вызывает `dict.__setitem__(TOS1[-i], TOS1, TOS)`. Используется для реализации словарных включений (dict comprehensions).446447Новое в версии 3.1.448449Изменено в версии 3.8: Значением отображения теперь является TOS, а ключом – TOS1. Ранее они были переставлены.450451Для всех инструкций [`SET_ADD`](https://python-all.ru/3.11/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.11/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.11/library/dis.html#opcode-MAP_ADD), когда добавленное значение или пара ключ/значение извлекаются, объект-контейнер остаётся в стеке, чтобы быть доступным для последующих итераций цикла.452453#### `RETURN_VALUE`454455Возвращает TOS вызывающей стороне функции.456457#### `YIELD_VALUE`458459Извлекает TOS и возвращает его из [генератора](https://python-all.ru/3.11/glossary.html#term-generator).460461#### `SETUP_ANNOTATIONS`462463Проверяет, определён ли `__annotations__` в `locals()`; если нет, он устанавливается в пустой `dict`. Этот опкод генерируется, только если тело класса или модуля статически содержит [аннотации переменных](https://python-all.ru/3.11/glossary.html#term-variable-annotation).464465Новое в версии 3.6.466467#### `IMPORT_STAR`468469Загружает все имена, не начинающиеся с `'_'`, из модуля TOS в локальное пространство имён. Модуль удаляется после загрузки всех имён. Этот опкод реализует `from module import *`.470471#### `POP_EXCEPT`472473Извлекает значение из стека, которое используется для восстановления состояния исключения.474475Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.476477#### `RERAISE`478479Повторно возбуждает исключение, находящееся на вершине стека. Если oparg не равен нулю, извлекает из стека дополнительное значение, которое используется для установки [`f_lasti`](https://python-all.ru/3.11/reference/datamodel.html#frame.f_lasti) текущего фрейма.480481Новое в версии 3.9.482483Изменено в версии 3.11: Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.484485#### `PUSH_EXC_INFO`486487Извлекает значение из стека. Помещает текущее исключение на вершину стека. Возвращает обратно в стек то значение, которое было извлечено. Используется в обработчиках исключений.488489Новое в версии 3.11.490491#### `CHECK_EXC_MATCH`492493Выполняет сопоставление исключений для `except`. Проверяет, является ли TOS1 исключением, соответствующим TOS. Извлекает TOS и помещает логический результат проверки в стек.494495Новое в версии 3.11.496497#### `CHECK_EG_MATCH`498499Выполняет сопоставление исключений для `except*`. Применяет `split(TOS)` к группе исключений, представляющей TOS1.500501В случае совпадения извлекает из стека два элемента и помещает несовпадающую подгруппу (`None` при полном совпадении), а затем совпадающую подгруппу. При отсутствии совпадения извлекает один элемент (тип сопоставления) и помещает `None`.502503Новое в версии 3.11.504505#### `PREP_RERAISE_STAR`506507Объединяет списки возбуждённых и повторно возбуждённых исключений из TOS в группу исключений для распространения из блока try-except\*. Использует исходную группу исключений из TOS1 для восстановления структуры повторно возбуждённых исключений. Извлекает два элемента из стека и помещает исключение для повторного возбуждения или `None`, если такого нет.508509Новое в версии 3.11.510511#### `WITH_EXCEPT_START`512513Вызывает функцию, находящуюся на позиции 4 в стеке, с аргументами (type, val, tb), представляющими исключение на вершине стека. Используется для реализации вызова `context_manager.__exit__(*exc_info())`, когда исключение возникло в операторе [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with).514515Новое в версии 3.9.516517Изменено в версии 3.11: Функция `__exit__` теперь находится на позиции 4 в стеке, а не на 7. Представление исключения в стеке теперь состоит из одного элемента, а не из трёх.518519#### `LOAD_ASSERTION_ERROR`520521Помещает [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError) в стек. Используется оператором [`assert`](https://python-all.ru/3.11/reference/simple_stmts.html#assert).522523Новое в версии 3.9.524525#### `LOAD_BUILD_CLASS`526527Помещает `builtins.__build_class__()` в стек. Затем она вызывается для создания класса.528529#### `BEFORE_WITH(delta)`530531Этот опкод выполняет несколько операций перед началом блока with. Сначала, он загружает [`__exit__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__exit__) из контекстного менеджера и помещает его в стек для последующего использования [`WITH_EXCEPT_START`](https://python-all.ru/3.11/library/dis.html#opcode-WITH_EXCEPT_START). Затем, вызывается [`__enter__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__enter__). Наконец, результат вызова метода `__enter__()` помещается в стек.532533Новое в версии 3.11.534535#### `GET_LEN`536537Помещает `len(TOS)` в стек.538539Новое в версии 3.10.540541#### `MATCH_MAPPING`542543Если TOS является экземпляром [`collections.abc.Mapping`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Mapping) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_MAPPING`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_MAPPING) в [`tp_flags`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_flags)), помещает `True` в стек. В противном случае помещает `False`.544545Новое в версии 3.10.546547#### `MATCH_SEQUENCE`548549Если TOS является экземпляром [`collections.abc.Sequence`](https://python-all.ru/3.11/library/collections.abc.html#collections.abc.Sequence) и *не* является экземпляром [`str`](https://python-all.ru/3.11/library/stdtypes.html#str)/[`bytes`](https://python-all.ru/3.11/library/stdtypes.html#bytes)/[`bytearray`](https://python-all.ru/3.11/library/stdtypes.html#bytearray) (или, более технически: если у него установлен флаг [`Py_TPFLAGS_SEQUENCE`](https://python-all.ru/3.11/c-api/typeobj.html#c.Py_TPFLAGS_SEQUENCE) в его [`tp_flags`](https://python-all.ru/3.11/c-api/typeobj.html#c.PyTypeObject.tp_flags)), поместить `True` в стек. В противном случае поместить `False`.550551Новое в версии 3.10.552553#### `MATCH_KEYS`554555TOS – это кортеж ключей отображения, а TOS1 – объект сопоставления. Если TOS1 содержит все ключи из TOS, поместить [`tuple`](https://python-all.ru/3.11/library/stdtypes.html#tuple), содержащий соответствующие значения. В противном случае поместить `None`.556557Новое в версии 3.10.558559Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (`True`) или неудачу (`False`).560561#### `STORE_NAME(namei)`562563Реализует `name = TOS`. *namei* – это индекс *имени* в атрибуте [`co_names`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_names) объекта [кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects). Компилятор старается использовать [`STORE_FAST`](https://python-all.ru/3.11/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.11/library/dis.html#opcode-STORE_GLOBAL), если возможно.564565#### `DELETE_NAME(namei)`566567Реализует `del name`, где *namei* – это индекс в [`co_names`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_names) атрибуте [объекта кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects).568569#### `UNPACK_SEQUENCE(count)`570571Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.572573#### `UNPACK_EX(counts)`574575Реализует присваивание со звёздочкой: распаковывает итерируемый объект в TOS на отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.576577Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.578579#### `STORE_ATTR(namei)`580581Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.582583#### `DELETE_ATTR(namei)`584585Реализует `del TOS.name`, используя *namei* в качестве индекса в [`co_names`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_names) объекта [кода](https://python-all.ru/3.11/reference/datamodel.html#code-objects).586587#### `STORE_GLOBAL(namei)`588589Работает как [`STORE_NAME`](https://python-all.ru/3.11/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.590591#### `DELETE_GLOBAL(namei)`592593Работает как [`DELETE_NAME`](https://python-all.ru/3.11/library/dis.html#opcode-DELETE_NAME), но удаляет глобальное имя.594595#### `LOAD_CONST(consti)`596597Помещает `co_consts[consti]` в стек.598599#### `LOAD_NAME(namei)`600601Помещает значение, связанное с `co_names[namei]`, в стек.602603#### `BUILD_TUPLE(count)`604605Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.606607#### `BUILD_LIST(count)`608609Работает как [`BUILD_TUPLE`](https://python-all.ru/3.11/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.610611#### `BUILD_SET(count)`612613Работает как [`BUILD_TUPLE`](https://python-all.ru/3.11/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.614615#### `BUILD_MAP(count)`616617Помещает новый объект словаря в стек. Извлекает `2 * count` элементов так, чтобы словарь содержал *count* записей: `{..., TOS3: TOS2, TOS1: TOS}`.618619Изменено в версии 3.5: Словарь создаётся из элементов стека, а не создаётся пустой словарь, предварительно размещённый для *count* элементов.620621#### `BUILD_CONST_KEY_MAP(count)`622623Версия [`BUILD_MAP`](https://python-all.ru/3.11/library/dis.html#opcode-BUILD_MAP), оптимизированная для константных ключей. Снимает верхний элемент стека, содержащий кортеж ключей, затем, начиная с `TOS1`, снимает *count* значений и формирует словарь.624625Новое в версии 3.6.626627#### `BUILD_STRING(count)`628629Конкатенирует *count* строк из стека и помещает результирующую строку в стек.630631Новое в версии 3.6.632633#### `LIST_TO_TUPLE`634635Извлекает список из стека и помещает кортеж, содержащий те же значения.636637Новое в версии 3.9.638639#### `LIST_EXTEND(i)`640641Вызывает `list.extend(TOS1[-i], TOS)`. Используется для построения списков.642643Новое в версии 3.9.644645#### `SET_UPDATE(i)`646647Вызывает `set.update(TOS1[-i], TOS)`. Используется для создания множеств.648649Новое в версии 3.9.650651#### `DICT_UPDATE(i)`652653Вызывает `dict.update(TOS1[-i], TOS)`. Используется для создания словарей.654655Новое в версии 3.9.656657#### `DICT_MERGE(i)`658659Как [`DICT_UPDATE`](https://python-all.ru/3.11/library/dis.html#opcode-DICT_UPDATE), но вызывает исключение для повторяющихся ключей.660661Новое в версии 3.9.662663#### `LOAD_ATTR(namei)`664665Заменяет TOS на `getattr(TOS, co_names[namei])`.666667#### `COMPARE_OP(opname)`668669Выполняет логическую операцию. Имя операции можно найти в `cmp_op[opname]`.670671#### `IS_OP(invert)`672673Выполняет сравнение `is` или `is not`, если `invert` равно 1.674675Новое в версии 3.9.676677#### `CONTAINS_OP(invert)`678679Выполняет сравнение `in` или `not in`, если `invert` равно 1.680681Новое в версии 3.9.682683#### `IMPORT_NAME(namei)`684685Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и передаются в качестве аргументов *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.11/library/functions.html#import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для корректной инструкции import последующая инструкция [`STORE_FAST`](https://python-all.ru/3.11/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.686687#### `IMPORT_FROM(namei)`688689Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.11/library/dis.html#opcode-STORE_FAST).690691#### `JUMP_FORWARD(delta)`692693Увеличивает счётчик байт-кода на *delta*.694695#### `JUMP_BACKWARD(delta)`696697Уменьшает счётчик байт-кода на *delta*. Проверяет прерывания.698699Новое в версии 3.11.700701#### `JUMP_BACKWARD_NO_INTERRUPT(delta)`702703Уменьшает счётчик байт-кода на *delta*. Не проверяет прерывания.704705Новое в версии 3.11.706707#### `POP_JUMP_FORWARD_IF_TRUE(delta)`708709Если TOS истинно, увеличивает счётчик байткода на *delta*. TOS извлекается.710711Новое в версии 3.11.712713#### `POP_JUMP_BACKWARD_IF_TRUE(delta)`714715Если TOS истинно, уменьшает счётчик байткода на *delta*. TOS извлекается.716717Новое в версии 3.11.718719#### `POP_JUMP_FORWARD_IF_FALSE(delta)`720721Если TOS ложно, увеличивает счётчик байткода на *delta*. TOS извлекается.722723Новое в версии 3.11.724725#### `POP_JUMP_BACKWARD_IF_FALSE(delta)`726727Если TOS ложно, уменьшает счётчик байткода на *delta*. TOS извлекается.728729Новое в версии 3.11.730731#### `POP_JUMP_FORWARD_IF_NOT_NONE(delta)`732733Если TOS не равно `None`, увеличивает счётчик байткода на *delta*. TOS извлекается.734735Новое в версии 3.11.736737#### `POP_JUMP_BACKWARD_IF_NOT_NONE(delta)`738739Если TOS не равно `None`, уменьшает счётчик байткода на *delta*. TOS извлекается.740741Новое в версии 3.11.742743#### `POP_JUMP_FORWARD_IF_NONE(delta)`744745Если TOS равно `None`, увеличивает счётчик байткода на *delta*. TOS извлекается.746747Новое в версии 3.11.748749#### `POP_JUMP_BACKWARD_IF_NONE(delta)`750751Если TOS равно `None`, уменьшает счётчик байт-кода на *delta*. TOS удаляется из стека.752753Новое в версии 3.11.754755#### `JUMP_IF_TRUE_OR_POP(delta)`756757Если TOS истинно, увеличивает счётчик байт-кода на *delta* и оставляет TOS на стеке. В противном случае (TOS ложно), TOS удаляется из стека.758759Новое в версии 3.1.760761Изменено в версии 3.11: Аргумент операции (oparg) теперь является относительным смещением, а не абсолютной целью.762763#### `JUMP_IF_FALSE_OR_POP(delta)`764765Если TOS ложно, увеличивает счётчик байт-кода на *delta* и оставляет TOS на стеке. В противном случае (TOS истинно), TOS удаляется из стека.766767Новое в версии 3.1.768769Изменено в версии 3.11: Аргумент операции (oparg) теперь является относительным смещением, а не абсолютной целью.770771#### `FOR_ITER(delta)`772773TOS является [итератором](https://python-all.ru/3.11/glossary.html#term-iterator). Вызвать его метод [`__next__()`](https://python-all.ru/3.11/library/stdtypes.html#iterator.__next__). Если это даёт новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, TOS удаляется из стека, а счётчик байт-кода увеличивается на *delta*.774775#### `LOAD_GLOBAL(namei)`776777Загружает глобальную переменную `co_names[namei>>1]` в стек.778779Изменено в версии 3.11: Если младший бит `namei` установлен, то `NULL` помещается в стек перед глобальной переменной.780781#### `LOAD_FAST(var_num)`782783Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.784785#### `STORE_FAST(var_num)`786787Сохраняет TOS в локальную переменную `co_varnames[var_num]`.788789#### `DELETE_FAST(var_num)`790791Удаляет локальную переменную `co_varnames[var_num]`.792793#### `MAKE_CELL(i)`794795Создаёт новую ячейку в слоте `i`. Если этот слот не пуст, то это значение сохраняется в новую ячейку.796797Новое в версии 3.11.798799#### `LOAD_CLOSURE(i)`800801Помещает ссылку на ячейку, содержащуюся в слоте `i` хранилища «быстрых локальных переменных». Имя переменной – `co_fastlocalnames[i]`.802803Обратите внимание, что `LOAD_CLOSURE` по сути является псевдонимом для `LOAD_FAST`. Он существует, чтобы сделать байт-код немного более читаемым.804805Изменено в версии 3.11: `i` больше не смещается на длину `co_varnames`.806807#### `LOAD_DEREF(i)`808809Загружает ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных». Помещает в стек ссылку на объект, содержащийся в этой ячейке.810811Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_varnames).812813#### `LOAD_CLASSDEREF(i)`814815Похожа на [`LOAD_DEREF`](https://python-all.ru/3.11/library/dis.html#opcode-LOAD_DEREF), но сначала проверяет словарь локальных переменных, а затем обращается к ячейке. Используется для загрузки свободных переменных в телах классов.816817Новое в версии 3.4.818819Изменено в версии 3.11: `i` больше не смещается на длину `co_varnames`.820821#### `STORE_DEREF(i)`822823Сохраняет TOS в ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных».824825Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_varnames).826827#### `DELETE_DEREF(i)`828829Очищает ячейку, находящуюся в слоте `i` хранилища «быстрых локальных переменных». Используется оператором [`del`](https://python-all.ru/3.11/reference/simple_stmts.html#del).830831Новое в версии 3.2.832833Изменено в версии 3.11: `i` больше не смещается на длину [`co_varnames`](https://python-all.ru/3.11/reference/datamodel.html#codeobject.co_varnames).834835#### `COPY_FREE_VARS(n)`836837Копирует `n` свободных переменных из замыкания во фрейм. Устраняет необходимость в специальном коде на стороне вызывающего при вызове замыканий.838839Новое в версии 3.11.840841#### `RAISE_VARARGS(argc)`842843Вызывает исключение, используя одну из трёх форм оператора `raise`, в зависимости от значения *argc*:844845- 0: `raise` (повторный вызов предыдущего исключения)846- 1: `raise TOS` (вызов экземпляра или типа исключения по адресу `TOS`)847- 2: `raise TOS1 from TOS` (возбуждает экземпляр или тип исключения на `TOS1` с `__cause__` установленным в `TOS`)848849#### `CALL(argc)`850851Вызывает вызываемый объект с количеством аргументов, указанным `argc`, включая именованные аргументы, указанные предшествующей инструкцией [`KW_NAMES`](https://python-all.ru/3.11/library/dis.html#opcode-KW_NAMES), если таковые имеются. В стеке находятся (в порядке возрастания) либо:852853- NULL854- Вызываемый объект855- Позиционные аргументы856- Именованные аргументы857858или:859860- Вызываемый объект861- `self`862- Оставшиеся позиционные аргументы863- Именованные аргументы864865`argc` – это общее количество позиционных и именованных аргументов, за исключением `self`, если `NULL` отсутствует.866867`CALL` извлекает все аргументы и вызываемый объект из стека, вызывает вызываемый объект с этими аргументами и помещает возвращаемое значение, возвращённое вызываемым объектом.868869Новое в версии 3.11.870871#### `CALL_FUNCTION_EX(flags)`872873Вызывает вызываемый объект с набором позиционных и именованных аргументов переменной длины. Если установлен младший бит *flags*, на вершине стека находится отображающий объект (mapping), содержащий дополнительные именованные аргументы. Перед вызовом вызываемого объекта отображающий объект и итерируемый объект «распаковываются», и их содержимое передаётся как именованные и позиционные аргументы соответственно. `CALL_FUNCTION_EX` извлекает из стека все аргументы и вызываемый объект, вызывает вызываемый объект с этими аргументами и помещает в стек возвращаемое значение, возвращённое вызываемым объектом.874875Новое в версии 3.6.876877#### `LOAD_METHOD(namei)`878879Загружает метод с именем `co_names[namei]` из объекта TOS. TOS удаляется из стека. Этот байт-код различает два случая: если TOS имеет метод с правильным именем, он помещает в стек несвязанный метод и TOS. TOS будет использоваться как первый аргумент (`self`) в [`CALL`](https://python-all.ru/3.11/library/dis.html#opcode-CALL) при вызове несвязанного метода. В противном случае помещаются `NULL` и объект, возвращённый поиском атрибута.880881Добавлено в версии 3.7.882883#### `PRECALL(argc)`884885Префикс к [`CALL`](https://python-all.ru/3.11/library/dis.html#opcode-CALL). Логически это пустая операция. Она существует для обеспечения эффективной специализации вызовов. `argc` – количество аргументов, как описано в [`CALL`](https://python-all.ru/3.11/library/dis.html#opcode-CALL).886887Новое в версии 3.11.888889#### `PUSH_NULL`890891> Помещает `NULL` в стек. Используется в последовательности вызова для сопоставления с `NULL`, помещённым [`LOAD_METHOD`](https://python-all.ru/3.11/library/dis.html#opcode-LOAD_METHOD) для вызовов не-методов.892893Новое в версии 3.11.894895#### `KW_NAMES(i)`896897Является префиксом для [`PRECALL`](https://python-all.ru/3.11/library/dis.html#opcode-PRECALL). Сохраняет ссылку на `co_consts[consti]` во внутреннюю переменную для использования [`CALL`](https://python-all.ru/3.11/library/dis.html#opcode-CALL). `co_consts[consti]` должна быть кортежем строк.898899Новое в версии 3.11.900901#### `MAKE_FUNCTION(flags)`902903Помещает новый объект функции в стек. Снизу вверх потребляемый стек должен состоять из значений, если аргумент содержит указанное значение флага.904905- `0x01` кортеж значений по умолчанию для только-позиционных и позиционно-именованных параметров в позиционном порядке906- `0x02` словарь значений по умолчанию только-именованных параметров907- `0x04` кортеж строк, содержащих аннотации параметров908- `0x08` кортеж, содержащий ячейки для свободных переменных, образующий замыкание909- код, связанный с функцией (на TOS)910911Изменено в версии 3.10: Значение флага `0x04` теперь является кортежем строк вместо словаря912913Изменено в версии 3.11: Квалифицированное имя на TOS было удалено.914915#### `BUILD_SLICE(argc)`916917Помещает объект среза в стек. *argc* должен быть 2 или 3. Если равно 2, помещается `slice(TOS1, TOS)`; если 3, помещается `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.11/library/functions.html#slice).918919#### `EXTENDED_ARG(ext)`920921Является префиксом для любой операции, аргумент которой слишком велик, чтобы поместиться в один байт по умолчанию. *ext* содержит дополнительный байт, который выступает в качестве старших битов аргумента. Для каждой операции допускается не более трёх префиксов `EXTENDED_ARG`, формирующих аргумент от двух до четырёх байт.922923#### `FORMAT_VALUE(flags)`924925Используется для реализации форматированных строковых литералов (f-строк). Извлекает из стека необязательную *спецификацию формата*, затем обязательное *значение*. *Флаги* интерпретируются следующим образом:926927- `(flags & 0x03) == 0x00`: *значение* форматируется как есть.928- `(flags & 0x03) == 0x01`: извлечь [спецификацию формата](https://python-all.ru/3.11/library/stdtypes.html#str) из стека и использовать её, иначе использовать пустую *спецификацию формата*.929- `(flags & 0x03) == 0x02`: извлечь [спецификацию формата](https://python-all.ru/3.11/library/functions.html#repr) из стека и использовать её, иначе использовать пустую *спецификацию формата*.930- `(flags & 0x03) == 0x03`: извлечь [спецификацию формата](https://python-all.ru/3.11/library/functions.html#ascii) из стека и использовать её, иначе использовать пустую *спецификацию формата*.931- `(flags & 0x04) == 0x04`: извлечь *fmt\_spec* из стека и использовать его, иначе использовать пустой *fmt\_spec*.932933Форматирование выполняется с помощью [`PyObject_Format()`](https://python-all.ru/3.11/c-api/object.html#c.PyObject_Format). Результат помещается в стек.934935Новое в версии 3.6.936937#### `MATCH_CLASS(count)`938939TOS – это кортеж имен ключевых атрибутов, TOS1 – класс, с которым производится сопоставление, а TOS2 – объект сопоставления. *count* – количество позиционных подшаблонов.940941Извлечь TOS, TOS1 и TOS2. Если TOS2 является экземпляром TOS1 и имеет позиционные и ключевые атрибуты, требуемые *count* и TOS, поместить кортеж извлеченных атрибутов. Иначе поместить `None`.942943Новое в версии 3.10.944945Изменено в версии 3.11: Ранее эта инструкция также помещала в стек логическое значение, указывающее на успех (`True`) или неудачу (`False`).946947#### `RESUME(where)`948949> Пустая операция. Выполняет внутренние проверки трассировки, отладки и оптимизации.950>951> Операнд `where` отмечает, где происходит `RESUME`:952>953> - `0` Начало функции954> - `1` После выражения `yield`955> - `2` После выражения `yield from`956> - `3` После выражения `await`957958Новое в версии 3.11.959960#### `RETURN_GENERATOR`961962Создает генератор, корутину или асинхронный генератор из текущего фрейма. Очищает текущий фрейм и возвращает вновь созданный генератор.963964Новое в версии 3.11.965966#### `SEND`967968Отправляет `None` подгенератору этого генератора. Используется в операторах `yield from` и `await`.969970Новое в версии 3.11.971972#### `ASYNC_GEN_WRAP`973974Оборачивает значение на вершине стека в `async_generator_wrapped_value`. Используется для yield в асинхронных генераторах.975976Новое в версии 3.11.977978#### `HAVE_ARGUMENT`979980Это не совсем опкод. Он обозначает границу между опкодами, которые не используют свой аргумент, и теми, которые используют (соответственно `< HAVE_ARGUMENT` и `>= HAVE_ARGUMENT`).981982Изменено в версии 3.6: Теперь каждая инструкция имеет аргумент, но опкоды `< HAVE_ARGUMENT` игнорируют его. Раньше аргумент был только у опкодов `>= HAVE_ARGUMENT`.983984## Коллекции опкодов985986Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:987988#### `dis.opname`989990Последовательность имён операций, индексируемая с помощью байткода.991992#### `dis.opmap`993994Словарь, сопоставляющий имена операций с байткодами.995996#### `dis.cmp_op`997998Последовательность всех имён операций сравнения.9991000#### `dis.hasconst`10011002Последовательность байткодов, обращающихся к константе.10031004#### `dis.hasfree`10051006Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она *не* включает ссылки на глобальные или встроенные области видимости).10071008#### `dis.hasname`10091010Последовательность байткодов, обращающихся к атрибуту по имени.10111012#### `dis.hasjrel`10131014Последовательность байткодов, имеющих относительную цель перехода.10151016#### `dis.hasjabs`10171018Последовательность байткодов, имеющих абсолютную цель перехода.10191020#### `dis.haslocal`10211022Последовательность байткодов, обращающихся к локальной переменной.10231024#### `dis.hascompare`10251026Последовательность байткодов логических операций.1027