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

dis.md

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

1> **Источник:** https://python-all.ru/3.4/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 32.12. [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) – Дизассемблер байт-кода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.4/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) позволяет анализировать [*байт-код*](https://python-all.ru/3.4/glossary.html#term-bytecode) CPython, дизассемблируя его. Байт-код CPython, который этот модуль принимает на вход, определён в файле `Include/opcode.h` и используется компилятором и интерпретатором.1415**Особенность реализации CPython:** Байт-код является деталью реализации интерпретатора CPython. Нет никаких гарантий, что байт-код не будет добавлен, удалён или изменён в разных версиях Python. Не следует рассчитывать, что использование этого модуля будет работать в разных виртуальных машинах Python или в разных релизах Python.1617Пример: дана функция `myfunc()`:1819```python20def myfunc(alist):21    return len(alist)22```2324следующая команда позволяет вывести дизассемблированный код `myfunc()`:2526```python27>>> dis.dis(myfunc)28  2           0 LOAD_GLOBAL              0 (len)29              3 LOAD_FAST                0 (alist)30              6 CALL_FUNCTION            131              9 RETURN_VALUE32```3334(«2» – это номер строки).3536## 32.12.1. Анализ байткода3738Новое в версии 3.4.3940API анализа байт-кода позволяет оборачивать фрагменты кода Python в объект [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode), который предоставляет простой доступ к деталям скомпилированного кода.4142#### `class dis.Bytecode(x, *, first_line=None, current_offset=None)`4344Анализирует байт-код, соответствующий функции, методу, строке исходного кода или объекту кода (возвращаемому функцией [`compile()`](https://python-all.ru/3.4/library/functions.html#compile)).4546Это удобная обёртка над многими из перечисленных ниже функций, в первую очередь [`get_instructions()`](https://python-all.ru/3.4/library/dis.html#dis.get_instructions): при итерации по экземпляру [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) возвращаются операции байт-кода в виде экземпляров [`Instruction`](https://python-all.ru/3.4/library/dis.html#dis.Instruction).4748Если *first\_line* не равен None, он указывает номер строки, который должен отображаться для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строках исходного кода (если она есть) берётся непосредственно из дизассемблированного объекта кода.4950Если *current\_offset* не равен None, он задаёт смещение инструкции в дизассемблированном коде. Установка этого параметра означает, что [`dis()`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode.dis) будет отображать маркер “current instruction” рядом с указанным опкодом.5152#### `classmethod from_traceback(tb)`5354Создаёт экземпляр [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) из заданной трассировки, устанавливая *current\_offset* на инструкцию, вызвавшую исключение.5556#### `codeobj`5758Скомпилированный объект кода.5960#### `first_line`6162Первая строка исходного кода объекта кода (если доступна)6364#### `dis()`6566Возвращает отформатированное представление операций байт-кода (то же, что печатается функцией [`dis.dis()`](https://python-all.ru/3.4/library/dis.html#dis.dis), но возвращается в виде многострочной строки).6768#### `info()`6970Возвращает отформатированную многострочную строку с подробной информацией об объекте кода, как [`code_info()`](https://python-all.ru/3.4/library/dis.html#dis.code_info).7172Пример:7374```python75>>> bytecode = dis.Bytecode(myfunc)76>>> for instr in bytecode:77...     print(instr.opname)78...79LOAD_GLOBAL80LOAD_FAST81CALL_FUNCTION82RETURN_VALUE83```8485## 32.12.2. Функции анализа8687Модуль [`dis`](https://python-all.ru/3.4/library/dis.html#module-dis) также определяет следующие функции анализа, которые преобразуют входные данные напрямую в нужный результат. Они могут быть полезны, если выполняется только одна операция и промежуточный объект анализа не нужен:8889#### `dis.code_info(x)`9091Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для указанной функции, метода, строки исходного кода или объекта кода.9293Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.9495Новое в версии 3.2.9697#### `dis.show_code(x, *, file=None)`9899Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в *file* (или в `sys.stdout`, если *file* не указан).100101Это удобная краткая запись для `print(code_info(x), file=file)`, предназначенная для интерактивного исследования в приглашении интерпретатора.102103Новое в версии 3.2.104105Изменено в версии 3.4: Добавлен параметр *file*.106107#### `dis.dis(x=None, *, file=None)`108109Дизассемблирует объект *x*. *x* может обозначать модуль, класс, метод, функцию, объект кода, строку исходного кода или последовательность байтов сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы. Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Строки сначала компилируются в объекты кода с помощью встроенной функции [`compile()`](https://python-all.ru/3.4/library/functions.html#compile), а затем дизассемблируются. Если объект не указан, функция дизассемблирует последнюю трассировку.110111Результат дизассемблирования выводится в виде текста в указанный аргумент *file*, если он задан, иначе в `sys.stdout`.112113Изменено в версии 3.4: Добавлен параметр *file*.114115#### `dis.distb(tb=None, *, file=None)`116117Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.118119Результат дизассемблирования выводится в виде текста в указанный аргумент *file*, если он задан, иначе в `sys.stdout`.120121Изменено в версии 3.4: Добавлен параметр *file*.122123#### `dis.disassemble(code, lasti=-1, *, file=None)`124125#### `dis.disco(code, lasti=-1, *, file=None)`126127Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:1281291. номер строки для первой инструкции каждой строки1302. текущая инструкция, помечена как `-->`,1313. инструкция с меткой, помечена `>>`,1324. адрес инструкции,1335. название кода операции,1346. параметры операции и1357. интерпретация параметров в скобках.136137Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.138139Дизассемблированный код выводится в виде текста в аргумент *file*, если он указан, иначе – в `sys.stdout`.140141Изменено в версии 3.4: Добавлен параметр *file*.142143#### `dis.get_instructions(x, *, first_line=None)`144145Возвращает итератор по инструкциям в переданной функции, методе, строке исходного кода или объекте кода.146147Итератор генерирует последовательность именованных кортежей [`Instruction`](https://python-all.ru/3.4/library/dis.html#dis.Instruction), содержащих подробности каждой операции в переданном коде.148149Если *first\_line* не равен None, он указывает номер строки, который должен отображаться для первой строки исходного кода в дизассемблированном коде. В противном случае информация о строках исходного кода (если она есть) берётся непосредственно из объекта дизассемблированного кода.150151Новое в версии 3.4.152153#### `dis.findlinestarts(code)`154155Эта функция-генератор использует атрибуты `co_firstlineno` и `co_lnotab` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются в виде пар `(offset, lineno)`.156157#### `dis.findlabels(code)`158159Определяет все смещения в объекте кода *code*, которые являются целями перехода, и\\nвозвращает список этих смещений.160161#### `dis.stack_effect(opcode[, oparg])`162163Вычисляет эффект стека для *opcode* с аргументом *oparg*.164165Новое в версии 3.4.166167## 32.12.3. Инструкции байткода Python168169Функция [`get_instructions()`](https://python-all.ru/3.4/library/dis.html#dis.get_instructions) и класс [`Bytecode`](https://python-all.ru/3.4/library/dis.html#dis.Bytecode) предоставляют подробную информацию об инструкциях байт-кода в виде экземпляров [`Instruction`](https://python-all.ru/3.4/library/dis.html#dis.Instruction):170171#### `class dis.Instruction`172173Подробности об операции байткода174175#### `opcode`176177Числовой код операции, соответствующий значениям опкодов, перечисленным ниже, и значениям байткода в [*коллекциях Opcode*](https://python-all.ru/3.4/library/dis.html#opcode-collections).178179#### `opname`180181Человекочитаемое имя операции182183#### `arg`184185числовой аргумент операции (если есть), иначе None186187#### `argval`188189разрешённое значение аргумента (если известно), иначе то же, что и arg190191#### `argrepr`192193человекочитаемое описание аргумента операции194195#### `offset`196197начальный индекс операции в последовательности байт-кода198199#### `starts_line`200201строка, начинающаяся с этой операции (если есть), иначе None202203#### `is_jump_target`204205`True`, если другой код переходит сюда, иначе `False`206207Новое в версии 3.4.208209В настоящее время компилятор Python генерирует следующие инструкции байткода.210211**Общие инструкции**212213**`NOP`**214215Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.216217**`POP_TOP`**218219Удаляет элемент с вершины стека (TOS).220221**`ROT_TWO`**222223Меняет местами два верхних элемента стека.224225**`ROT_THREE`**226227Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.228229**`DUP_TOP`**230231Дублирует ссылку на вершине стека.232233**`DUP_TOP_TWO`**234235Дублирует две ссылки на вершине стека, сохраняя их порядок.236237**Унарные операции**238239Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.240241**`UNARY_POSITIVE`**242243Реализует `TOS = +TOS`.244245**`UNARY_NEGATIVE`**246247Реализует `TOS = -TOS`.248249**`UNARY_NOT`**250251Реализует `TOS = не TOS`.252253**`UNARY_INVERT`**254255Реализует `TOS = ~TOS`.256257**`GET_ITER`**258259Реализует `TOS = iter(TOS)`.260261**Бинарные операции**262263Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.264265**`BINARY_POWER`**266267Реализует `TOS = TOS1 ** TOS`.268269**`BINARY_MULTIPLY`**270271Реализует `TOS = TOS1 * TOS`.272273**`BINARY_FLOOR_DIVIDE`**274275Реализует `TOS = TOS1 // TOS`.276277**`BINARY_TRUE_DIVIDE`**278279Реализует `TOS = TOS1 / TOS`.280281**`BINARY_MODULO`**282283Реализует `TOS = TOS1 % TOS`.284285**`BINARY_ADD`**286287Реализует `TOS = TOS1 + TOS`.288289**`BINARY_SUBTRACT`**290291Реализует `TOS = TOS1 - TOS`.292293**`BINARY_SUBSCR`**294295Реализует `TOS = TOS1[TOS]`.296297**`BINARY_LSHIFT`**298299Реализует `TOS = TOS1 << TOS`.300301**`BINARY_RSHIFT`**302303Реализует `TOS = TOS1 >> TOS`.304305**`BINARY_AND`**306307Реализует `TOS = TOS1 & TOS`.308309**`BINARY_XOR`**310311Реализует `TOS = TOS1 ^ TOS`.312313**`BINARY_OR`**314315Реализует `TOS = TOS1 | TOS`.316317**Операции на месте**318319Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.320321**`INPLACE_POWER`**322323Реализует in-place: `TOS = TOS1 ** TOS`.324325**`INPLACE_MULTIPLY`**326327Реализует in-place: `TOS = TOS1 * TOS`.328329**`INPLACE_FLOOR_DIVIDE`**330331Реализует in-place: `TOS = TOS1 // TOS`.332333**`INPLACE_TRUE_DIVIDE`**334335Реализует in-place: `TOS = TOS1 / TOS`.336337**`INPLACE_MODULO`**338339Реализует in-place: `TOS = TOS1 % TOS`.340341**`INPLACE_ADD`**342343Реализует in-place: `TOS = TOS1 + TOS`.344345**`INPLACE_SUBTRACT`**346347Реализует in-place: `TOS = TOS1 - TOS`.348349**`INPLACE_LSHIFT`**350351Реализует in-place: `TOS = TOS1 << TOS`.352353**`INPLACE_RSHIFT`**354355Реализует in-place: `TOS = TOS1 >> TOS`.356357**`INPLACE_AND`**358359Реализует in-place: `TOS = TOS1 & TOS`.360361**`INPLACE_XOR`**362363Реализует in-place: `TOS = TOS1 ^ TOS`.364365**`INPLACE_OR`**366367Реализует in-place: `TOS = TOS1 | TOS`.368369**`STORE_SUBSCR`**370371Реализует `TOS1[TOS] = TOS2`.372373**`DELETE_SUBSCR`**374375Реализует `del TOS1[TOS]`.376377**Прочие опкоды**378379**`PRINT_EXPR`**380381Реализует инструкцию выражения для интерактивного режима. TOS удаляется из стека и выводится. В неинтерактивном режиме инструкция выражения завершается [`POP_TOP`](https://python-all.ru/3.4/library/dis.html#opcode-POP_TOP).382383**`BREAK_LOOP`**384385Завершает цикл при выполнении оператора [`break`](https://python-all.ru/3.4/reference/simple_stmts.html#break).386387**`CONTINUE_LOOP`(*target*)**388389Продолжает цикл из-за оператора [`continue`](https://python-all.ru/3.4/reference/simple_stmts.html#continue). *target* – это адрес, на который нужно перейти (должен быть инструкцией [`FOR_ITER`](https://python-all.ru/3.4/library/dis.html#opcode-FOR_ITER)).390391**`SET_ADD`(*i*)**392393Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).394395**`LIST_APPEND`(*i*)**396397Вызывает `list.append(TOS[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).398399**`MAP_ADD`(*i*)**400401Вызывает `dict.setitem(TOS1[-i], TOS, TOS1)`. Используется для реализации словарных включений (dict comprehensions).402403Для всех инструкций [`SET_ADD`](https://python-all.ru/3.4/library/dis.html#opcode-SET_ADD), [`LIST_APPEND`](https://python-all.ru/3.4/library/dis.html#opcode-LIST_APPEND) и [`MAP_ADD`](https://python-all.ru/3.4/library/dis.html#opcode-MAP_ADD): после извлечения добавленного значения или пары ключ/значение объект-контейнер остаётся в стеке, чтобы быть доступным для следующих итераций цикла.404405**`RETURN_VALUE`**406407Возвращает TOS вызывающей стороне функции.408409**`YIELD_VALUE`**410411Извлекает TOS и возвращает его из [*генератора*](https://python-all.ru/3.4/glossary.html#term-generator).412413**`YIELD_FROM`**414415Извлекает TOS и делегирует ему как под-итератор от [*генератора*](https://python-all.ru/3.4/glossary.html#term-generator).416417Новое в версии 3.3.418419**`IMPORT_STAR`**420421Загружает все символы, не начинающиеся с `'_'`, из модуля TOS напрямую в локальное пространство имён. Модуль извлекается после загрузки всех имён. Эта опкод реализует `from module import *`.422423**`POP_BLOCK`**424425Удаляет один блок из стека блоков. В каждом фрейме есть стек блоков, представляющий вложенные циклы, операторы try и т.п.426427**`POP_EXCEPT`**428429Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключения, неявно создаваемым при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.430431**`END_FINALLY`**432433Завершает блок [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally). Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращается, и продолжает со следующим внешним блоком.434435**`LOAD_BUILD_CLASS`**436437Помещает `builtins.__build_class__()` в стек. Позже он вызывается с помощью [`CALL_FUNCTION`](https://python-all.ru/3.4/library/dis.html#opcode-CALL_FUNCTION) для создания класса.438439**`SETUP_WITH`(*delta*)**440441Эта опкод выполняет несколько операций перед началом блока with. Сначала загружается [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__) из менеджера контекста и помещается в стек для последующего использования [`WITH_CLEANUP`](https://python-all.ru/3.4/library/dis.html#opcode-WITH_CLEANUP). Затем вызывается [`__enter__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__enter__), и помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода enter помещается в стек. Следующая опкод либо игнорирует его ([`POP_TOP`](https://python-all.ru/3.4/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную ([`STORE_FAST`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/3.4/library/dis.html#opcode-UNPACK_SEQUENCE)).442443**`WITH_CLEANUP`**444445Очищает стек при завершении блока оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with). TOS – это привязанный метод менеджера контекста [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__). Под TOS находятся 1–3 значения, указывающие, как/почему был введён блок finally:446447- SECOND = `None`448- (SECOND, THIRD) = (`WHY_{RETURN,CONTINUE}`), retval449- SECOND = `WHY_*`; под ним нет retval450- (SECOND, THIRD, FOURTH) = exc\_info()451452В последнем случае вызывается `TOS(SECOND, THIRD, FOURTH)`, иначе `TOS(None, None, None)`. Кроме того, TOS удаляется из стека.453454Если стек представляет исключение *и* вызов функции возвращает «истинное» значение, эта информация «обнуляется» и заменяется одним `WHY_SILENCED`, чтобы предотвратить повторное возбуждение исключения через [`END_FINALLY`](https://python-all.ru/3.4/library/dis.html#opcode-END_FINALLY). (Но нелокальные goto всё равно будут возобновлены.)455456Все следующие опкоды требуют аргументов. Аргумент занимает два байта, причём старший байт идёт последним.457458**`STORE_NAME`(*namei*)**459460Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор старается использовать [`STORE_FAST`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_FAST) или [`STORE_GLOBAL`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_GLOBAL), если это возможно.461462**`DELETE_NAME`(*namei*)**463464Реализует `del name`, где *namei* – это индекс в атрибуте `co_names` объекта кода.465466**`UNPACK_SEQUENCE`(*count*)**467468Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.469470**`UNPACK_EX`(*counts*)**471472Реализует присваивание с целевой переменной со звёздочкой: распаковывает итерируемый объект в TOS в отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.473474Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.475476**`STORE_ATTR`(*namei*)**477478Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.479480**`DELETE_ATTR`(*namei*)**481482Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.483484**`STORE_GLOBAL`(*namei*)**485486Работает как [`STORE_NAME`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_NAME), но сохраняет имя как глобальное.487488**`DELETE_GLOBAL`(*namei*)**489490Работает как [`DELETE_NAME`](https://python-all.ru/3.4/library/dis.html#opcode-DELETE_NAME), но удаляет глобальное имя.491492**`LOAD_CONST`(*consti*)**493494Помещает `co_consts[consti]` в стек.495496**`LOAD_NAME`(*namei*)**497498Помещает значение, связанное с `co_names[namei]`, в стек.499500**`BUILD_TUPLE`(*count*)**501502Создаёт кортеж, потребляя *count* элементов из стека, и помещает полученный кортеж в стек.503504**`BUILD_LIST`(*count*)**505506Работает как [`BUILD_TUPLE`](https://python-all.ru/3.4/library/dis.html#opcode-BUILD_TUPLE), но создаёт список.507508**`BUILD_SET`(*count*)**509510Работает как [`BUILD_TUPLE`](https://python-all.ru/3.4/library/dis.html#opcode-BUILD_TUPLE), но создаёт множество.511512**`BUILD_MAP`(*count*)**513514Помещает новый объект словаря в стек. Словарь предварительно настраивается на хранение *count* записей.515516**`LOAD_ATTR`(*namei*)**517518Заменяет TOS на `getattr(TOS, co_names[namei])`.519520**`COMPARE_OP`(*opname*)**521522Выполняет булеву операцию. Имя операции можно найти в `cmp_op[opname]`.523524**`IMPORT_NAME`(*namei*)**525526Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и предоставляют аргументы *fromlist* и *level* функции [`__import__()`](https://python-all.ru/3.4/library/functions.html#__import__). Объект модуля помещается в стек. Текущее пространство имён не затрагивается: для правильной инструкции импорта последующая инструкция [`STORE_FAST`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_FAST) изменяет пространство имён.527528**`IMPORT_FROM`(*namei*)**529530Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек для последующего сохранения инструкцией [`STORE_FAST`](https://python-all.ru/3.4/library/dis.html#opcode-STORE_FAST).531532**`JUMP_FORWARD`(*delta*)**533534Увеличивает счётчик байт-кода на *delta*.535536**`POP_JUMP_IF_TRUE`(*target*)**537538Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.539540**`POP_JUMP_IF_FALSE`(*target*)**541542Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.543544**`JUMP_IF_TRUE_OR_POP`(*target*)**545546Если TOS истинно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS ложно) TOS извлекается.547548**`JUMP_IF_FALSE_OR_POP`(*target*)**549550Если TOS ложно, устанавливает счётчик байткода в *target* и оставляет TOS на стеке. В противном случае (TOS истинно) TOS извлекается.551552**`JUMP_ABSOLUTE`(*target*)**553554Устанавливает счётчик байткода в *target*.555556**`FOR_ITER`(*delta*)**557558TOS – это [*итератор*](https://python-all.ru/3.4/glossary.html#term-iterator). Вызвать его метод [`__next__()`](https://python-all.ru/3.4/library/stdtypes.html#iterator.__next__). Если он возвращает новое значение, поместить его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, TOS извлекается, а счётчик байт-кода увеличивается на *delta*.559560**`LOAD_GLOBAL`(*namei*)**561562Загружает глобальную переменную с именем `co_names[namei]` в стек.563564**`SETUP_LOOP`(*delta*)**565566Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер *delta* байт.567568**`SETUP_EXCEPT`(*delta*)**569570Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на первый блок except.571572**`SETUP_FINALLY`(*delta*)**573574Pushes a try block from a try-except clause onto the block stack. *delta* points to the finally block.575576**`STORE_MAP`**577578Сохраняет пару ключ-значение в словаре. Извлекает ключ и значение, оставляя словарь в стеке.579580**`LOAD_FAST`(*var\_num*)**581582Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.583584**`STORE_FAST`(*var\_num*)**585586Сохраняет TOS в локальную переменную `co_varnames[var_num]`.587588**`DELETE_FAST`(*var\_num*)**589590Удаляет локальную переменную `co_varnames[var_num]`.591592**`LOAD_CLOSURE`(*i*)**593594Помещает ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае это `co_freevars[i - len(co_cellvars)]`.595596**`LOAD_DEREF`(*i*)**597598Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.599600**`LOAD_CLASSDEREF`(*i*)**601602Работает почти как [`LOAD_DEREF`](https://python-all.ru/3.4/library/dis.html#opcode-LOAD_DEREF), но сначала проверяет словарь locals, прежде чем обращаться к ячейке. Это используется для загрузки свободных переменных в телах классов.603604**`STORE_DEREF`(*i*)**605606Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.607608**`DELETE_DEREF`(*i*)**609610Опустошает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Используется оператором [`del`](https://python-all.ru/3.4/reference/simple_stmts.html#del).611612**`RAISE_VARARGS`(*argc*)**613614Вызывает исключение. *argc* указывает количество параметров оператора raise (от 0 до 3). Обработчик увидит объект traceback как TOS2, параметр как TOS1, а исключение как TOS.615616**`CALL_FUNCTION`(*argc*)**617618Вызывает функцию. Младший байт *argc* указывает количество позиционных параметров, старший байт – количество именованных параметров. В стеке опкод сначала находит именованные параметры. Для каждого именованного аргумента значение находится над ключом. Под именованными параметрами в стеке находятся позиционные параметры, при этом самый правый параметр сверху. Под параметрами в стеке находится вызываемый объект функции. Извлекает все аргументы функции и саму функцию из стека и помещает возвращаемое значение.619620**`MAKE_FUNCTION`(*argc*)**621622Помещает новый объект функции в стек. Снизу вверх, используемый стек должен состоять из623624- `argc & 0xFF` объекты аргументов по умолчанию в позиционном порядке.625- `(argc >> 8) & 0xFF` пары имя и аргумент по умолчанию, причём имя находится непосредственно под объектом в стеке, для параметров только по ключевым словам626- `(argc >> 16) & 0x7FFF` объекты аннотаций параметров627- кортеж, перечисляющий имена параметров для аннотаций (только если есть хотя бы один объект аннотации)628- код, связанный с функцией (на TOS1)629- [*полное имя*](https://python-all.ru/3.4/glossary.html#term-qualified-name) функции (на TOS)630631**`MAKE_CLOSURE`(*argc*)**632633Создаёт новый объект функции, устанавливает его слот *\_\_closure\_\_* и помещает его в стек. TOS – это [*полное имя*](https://python-all.ru/3.4/glossary.html#term-qualified-name) функции, TOS1 – это код, связанный с функцией, а TOS2 – это кортеж, содержащий ячейки для свободных переменных замыкания. *argc* интерпретируется так же, как в `MAKE_FUNCTION`; аннотации и значения по умолчанию также находятся в том же порядке ниже TOS2.634635**`BUILD_SLICE`(*argc*)**636637Помещает объект среза в стек. *argc* должен быть равен 2 или 3. Если он равен 2, помещается `slice(TOS1, TOS)`; если 3 – `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.4/library/functions.html#slice).638639**`EXTENDED_ARG`(*ext*)**640641Добавляет префикс к любой опкоду, чей аргумент слишком велик, чтобы поместиться в стандартные два байта. *ext* содержит два дополнительных байта, которые вместе с аргументом последующего опкода образуют четырёхбайтовый аргумент, причём *ext* является двумя старшими байтами.642643**`CALL_FUNCTION_VAR`(*argc*)**644645Вызывает функцию. *argc* интерпретируется так же, как в [`CALL_FUNCTION`](https://python-all.ru/3.4/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находится список с переменным количеством аргументов, за которым следуют ключевые и позиционные аргументы.646647**`CALL_FUNCTION_KW`(*argc*)**648649Вызывает функцию. *argc* интерпретируется так же, как в [`CALL_FUNCTION`](https://python-all.ru/3.4/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находится словарь ключевых аргументов, за которым следуют явные ключевые и позиционные аргументы.650651**`CALL_FUNCTION_VAR_KW`(*argc*)**652653Вызывает функцию. *argc* интерпретируется так же, как в [`CALL_FUNCTION`](https://python-all.ru/3.4/library/dis.html#opcode-CALL_FUNCTION). На вершине стека находится словарь ключевых аргументов, за которым следует кортеж аргументов переменной длины, а затем явные ключевые и позиционные аргументы.654655**`HAVE_ARGUMENT`**656657Это на самом деле не опкод. Он определяет разделительную линию между опкодами, которые не принимают аргументы `< HAVE_ARGUMENT`, и теми, которые принимают `>= HAVE_ARGUMENT`.658659## 32.12.4. Коллекции опкодов660661Эти коллекции предоставляются для автоматического самоанализа инструкций байткода:662663#### `dis.opname`664665Последовательность имён операций, индексируемая с помощью байткода.666667#### `dis.opmap`668669Словарь, сопоставляющий имена операций с байткодами.670671#### `dis.cmp_op`672673Последовательность всех имён операций сравнения.674675#### `dis.hasconst`676677Последовательность байткодов, имеющих постоянный параметр.678679#### `dis.hasfree`680681Последовательность байткодов, которые обращаются к свободной переменной (обратите внимание, что «free» в данном контексте относится к именам в текущей области видимости, на которые ссылаются внутренние области видимости, или к именам во внешних областях видимости, на которые ссылаются из этой области. Она *не* включает ссылки на глобальные или встроенные области видимости).682683#### `dis.hasname`684685Последовательность байткодов, обращающихся к атрибуту по имени.686687#### `dis.hasjrel`688689Последовательность байткодов, имеющих относительную цель перехода.690691#### `dis.hasjabs`692693Последовательность байткодов, имеющих абсолютную цель перехода.694695#### `dis.haslocal`696697Последовательность байткодов, обращающихся к локальной переменной.698699#### `dis.hascompare`700701Последовательность байткодов логических операций.702