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

dis.md

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

1> **Источник:** https://python-all.ru/3.3/library/dis.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 31.12. [`dis`](https://python-all.ru/3.3/library/dis.html#module-dis) – Дизассемблер байткода Python89**Исходный код:** [Lib/dis.py](https://python-all.ru/src/3.3/Lib/dis.py)1011---1213Модуль [`dis`](https://python-all.ru/3.3/library/dis.html#module-dis) поддерживает анализ [*байткода*](https://python-all.ru/3.3/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Модуль [`dis`](https://python-all.ru/3.3/library/dis.html#module-dis) определяет следующие функции и константы:3738#### `dis.code_info(x)`3940Возвращает отформатированную многострочную строку с подробной информацией об объекте кода для указанной функции, метода, строки исходного кода или объекта кода.4142Обратите внимание, что точное содержимое строк с информацией о коде сильно зависит от реализации и может произвольно меняться в разных реализациях Python или версиях Python.4344Новое в версии 3.2.4546#### `dis.show_code(x)`4748Выводит подробную информацию об объекте кода для указанной функции, метода, строки исходного кода или объекта кода в stdout.4950Это удобная краткая форма записи для `print(code_info(x))`, предназначенная для интерактивного изучения в приглашении интерпретатора.5152Новое в версии 3.2.5354#### `dis.dis(x=None)`5556Дизассемблирует объект *x*. *x* может обозначать модуль, класс, метод, функцию, объект кода, строку исходного кода или последовательность байтов сырого байт-кода. Для модуля дизассемблируются все функции. Для класса – все методы. Для объекта кода или последовательности сырого байт-кода выводится по одной строке на каждую инструкцию байт-кода. Строки сначала компилируются в объекты кода с помощью встроенной функции [`compile()`](https://python-all.ru/3.3/library/functions.html#compile), а затем дизассемблируются. Если объект не указан, функция дизассемблирует последнюю трассировку.5758#### `dis.distb(tb=None)`5960Дисассемблирует функцию, находящуюся на вершине стека traceback; если traceback не передан, используется последний. Указывается инструкция, вызвавшая исключение.6162#### `dis.disassemble(code, lasti=-1)`6364#### `dis.disco(code, lasti=-1)`6566Дисассемблирует объект кода, указывая последнюю инструкцию, если передан *lasti*. Результат разбит на следующие столбцы:67681. номер строки для первой инструкции каждой строки692. текущая инструкция, помечена как `-->`,703. инструкция с меткой, помечена `>>`,714. адрес инструкции,725. название кода операции,736. параметры операции и747. интерпретация параметров в скобках.7576Интерпретация параметров распознаёт имена локальных и глобальных переменных, константные значения, цели переходов и операторы сравнения.7778#### `dis.findlinestarts(code)`7980Эта функция-генератор использует атрибуты `co_firstlineno` и `co_lnotab` объекта кода *code* для поиска смещений, соответствующих началам строк в исходном коде. Они генерируются в виде пар `(offset, lineno)`.8182#### `dis.findlabels(code)`8384Определяет все смещения в объекте кода *code*, которые являются целями перехода, и\\nвозвращает список этих смещений.8586#### `dis.opname`8788Последовательность имён операций, индексируемая с помощью байткода.8990#### `dis.opmap`9192Словарь, сопоставляющий имена операций с байткодами.9394#### `dis.cmp_op`9596Последовательность всех имён операций сравнения.9798#### `dis.hasconst`99100Последовательность байткодов, имеющих постоянный параметр.101102#### `dis.hasfree`103104Последовательность байткодов, обращающихся к свободной переменной.105106#### `dis.hasname`107108Последовательность байткодов, обращающихся к атрибуту по имени.109110#### `dis.hasjrel`111112Последовательность байткодов, имеющих относительную цель перехода.113114#### `dis.hasjabs`115116Последовательность байткодов, имеющих абсолютную цель перехода.117118#### `dis.haslocal`119120Последовательность байткодов, обращающихся к локальной переменной.121122#### `dis.hascompare`123124Последовательность байткодов логических операций.125126## 31.12.1. Инструкции байткода Python127128В настоящее время компилятор Python генерирует следующие инструкции байткода.129130**Общие инструкции**131132**`NOP`**133134Код, который ничего не делает. Используется в качестве заполнителя оптимизатором байт-кода.135136**`POP_TOP`**137138Удаляет элемент с вершины стека (TOS).139140**`ROT_TWO`**141142Меняет местами два верхних элемента стека.143144**`ROT_THREE`**145146Поднимает второй и третий элементы стека на одну позицию вверх, перемещает верхний вниз на третью позицию.147148**`DUP_TOP`**149150Дублирует ссылку на вершине стека.151152**`DUP_TOP_TWO`**153154Дублирует две ссылки на вершине стека, сохраняя их порядок.155156**Унарные операции**157158Унарные операции берут элемент с вершины стека, применяют операцию и помещают результат обратно на стек.159160**`UNARY_POSITIVE`**161162Реализует `TOS = +TOS`.163164**`UNARY_NEGATIVE`**165166Реализует `TOS = -TOS`.167168**`UNARY_NOT`**169170Реализует `TOS = не TOS`.171172**`UNARY_INVERT`**173174Реализует `TOS = ~TOS`.175176**`GET_ITER`**177178Реализует `TOS = iter(TOS)`.179180**Бинарные операции**181182Бинарные операции удаляют из стека элемент с вершины (TOS) и второй сверху элемент стека (TOS1). Они выполняют операцию и помещают результат обратно в стек.183184**`BINARY_POWER`**185186Реализует `TOS = TOS1 ** TOS`.187188**`BINARY_MULTIPLY`**189190Реализует `TOS = TOS1 * TOS`.191192**`BINARY_FLOOR_DIVIDE`**193194Реализует `TOS = TOS1 // TOS`.195196**`BINARY_TRUE_DIVIDE`**197198Реализует `TOS = TOS1 / TOS`.199200**`BINARY_MODULO`**201202Реализует `TOS = TOS1 % TOS`.203204**`BINARY_ADD`**205206Реализует `TOS = TOS1 + TOS`.207208**`BINARY_SUBTRACT`**209210Реализует `TOS = TOS1 - TOS`.211212**`BINARY_SUBSCR`**213214Реализует `TOS = TOS1[TOS]`.215216**`BINARY_LSHIFT`**217218Реализует `TOS = TOS1 << TOS`.219220**`BINARY_RSHIFT`**221222Реализует `TOS = TOS1 >> TOS`.223224**`BINARY_AND`**225226Реализует `TOS = TOS1 & TOS`.227228**`BINARY_XOR`**229230Реализует `TOS = TOS1 ^ TOS`.231232**`BINARY_OR`**233234Реализует `TOS = TOS1 | TOS`.235236**Операции на месте**237238Операции на месте аналогичны бинарным: они также удаляют TOS и TOS1 и помещают результат обратно в стек, но операция выполняется на месте, если TOS1 это поддерживает, и результирующий TOS может (но не обязан) быть исходным TOS1.239240**`INPLACE_POWER`**241242Реализует in-place: `TOS = TOS1 ** TOS`.243244**`INPLACE_MULTIPLY`**245246Реализует in-place: `TOS = TOS1 * TOS`.247248**`INPLACE_FLOOR_DIVIDE`**249250Реализует in-place: `TOS = TOS1 // TOS`.251252**`INPLACE_TRUE_DIVIDE`**253254Реализует in-place: `TOS = TOS1 / TOS`.255256**`INPLACE_MODULO`**257258Реализует in-place: `TOS = TOS1 % TOS`.259260**`INPLACE_ADD`**261262Реализует in-place: `TOS = TOS1 + TOS`.263264**`INPLACE_SUBTRACT`**265266Реализует in-place: `TOS = TOS1 - TOS`.267268**`INPLACE_LSHIFT`**269270Реализует in-place: `TOS = TOS1 << TOS`.271272**`INPLACE_RSHIFT`**273274Реализует in-place: `TOS = TOS1 >> TOS`.275276**`INPLACE_AND`**277278Реализует in-place: `TOS = TOS1 & TOS`.279280**`INPLACE_XOR`**281282Реализует in-place: `TOS = TOS1 ^ TOS`.283284**`INPLACE_OR`**285286Реализует in-place: `TOS = TOS1 | TOS`.287288**`STORE_SUBSCR`**289290Реализует `TOS1[TOS] = TOS2`.291292**`DELETE_SUBSCR`**293294Реализует `del TOS1[TOS]`.295296**Прочие опкоды**297298**`PRINT_EXPR`**299300Реализует оператор выражения для интерактивного режима. TOS удаляется из стека и выводится на печать. В неинтерактивном режиме оператор выражения завершается `POP_STACK`.301302**`BREAK_LOOP`**303304Завершает цикл при выполнении оператора [`break`](https://python-all.ru/3.3/reference/simple_stmts.html#break).305306**`CONTINUE_LOOP`(*target*)**307308Продолжает цикл при выполнении оператора [`continue`](https://python-all.ru/3.3/reference/simple_stmts.html#continue). *target* – это адрес перехода (должен быть инструкцией `FOR_ITER`).309310**`SET_ADD`(*i*)**311312Вызывает `set.add(TOS1[-i], TOS)`. Используется для реализации множественных включений (set comprehensions).313314**`LIST_APPEND`(*i*)**315316Вызывает `list.append(TOS[-i], TOS)`. Используется для реализации списковых включений (list comprehensions).317318**`MAP_ADD`(*i*)**319320Вызывает `dict.setitem(TOS1[-i], TOS, TOS1)`. Используется для реализации словарных включений (dict comprehensions).321322Для всех инструкций SET\_ADD, LIST\_APPEND и MAP\_ADD, после извлечения добавляемого значения или пары ключ/значение, объект-контейнер остаётся в стеке, чтобы его можно было использовать в следующих итерациях цикла.323324**`RETURN_VALUE`**325326Возвращает TOS вызывающей стороне функции.327328**`YIELD_VALUE`**329330Извлекает `TOS` и возвращает его из [*генератора*](https://python-all.ru/3.3/glossary.html#term-generator).331332**`YIELD_FROM`**333334Извлекает `TOS` и делегирует ему как под-итератору из [*генератора*](https://python-all.ru/3.3/glossary.html#term-generator).335336Новое в версии 3.3.337338**`IMPORT_STAR`**339340Загружает все символы, не начинающиеся с `'_'`, непосредственно из модуля TOS в локальное пространство имён. Модуль извлекается после загрузки всех имён. Этот опкод реализует `from module import *`.341342**`POP_BLOCK`**343344Удаляет один блок из стека блоков. Для каждого фрейма существует стек блоков, обозначающий вложенные циклы, операторы try и тому подобное.345346**`POP_EXCEPT`**347348Удаляет один блок из стека блоков. Извлечённый блок должен быть блоком обработчика исключений, который неявно создаётся при входе в обработчик except. Помимо извлечения лишних значений из стека фрейма, последние три извлечённых значения используются для восстановления состояния исключения.349350**`END_FINALLY`**351352Завершает блок [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally). Интерпретатор запоминает, нужно ли повторно возбуждать исключение или функция возвращается, и продолжает со следующим внешним блоком.353354**`LOAD_BUILD_CLASS`**355356Помещает `builtins.__build_class__()` в стек. Позже она вызывается инструкцией `CALL_FUNCTION` для создания класса.357358**`SETUP_WITH`(*delta*)**359360Эта опкод выполняет несколько операций перед началом блока with. Сначала загружается [`__exit__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__exit__) из менеджера контекста и помещается в стек для последующего использования [`WITH_CLEANUP`](https://python-all.ru/3.3/library/dis.html#opcode-WITH_CLEANUP). Затем вызывается [`__enter__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__enter__), и помещается блок finally, указывающий на *delta*. Наконец, результат вызова метода enter помещается в стек. Следующая опкод либо игнорирует его ([`POP_TOP`](https://python-all.ru/3.3/library/dis.html#opcode-POP_TOP)), либо сохраняет в переменную ([`STORE_FAST`](https://python-all.ru/3.3/library/dis.html#opcode-STORE_FAST), [`STORE_NAME`](https://python-all.ru/3.3/library/dis.html#opcode-STORE_NAME) или [`UNPACK_SEQUENCE`](https://python-all.ru/3.3/library/dis.html#opcode-UNPACK_SEQUENCE)).361362**`WITH_CLEANUP`**363364Очищает стек при выходе из блока оператора [`with`](https://python-all.ru/3.3/reference/compound_stmts.html#with). TOS – это привязанный метод [`__exit__()`](https://python-all.ru/3.3/reference/datamodel.html#object.__exit__) менеджера контекста. Ниже TOS находятся 1–3 значения, указывающие, каким образом/почему был выполнен блок finally:365366- SECOND = `None`367- (SECOND, THIRD) = (`WHY_{RETURN,CONTINUE}`), retval368- SECOND = `WHY_*`; под ним нет retval369- (SECOND, THIRD, FOURTH) = exc\_info()370371В последнем случае вызывается `TOS(SECOND, THIRD, FOURTH)`, иначе `TOS(None, None, None)`. Кроме того, TOS удаляется из стека.372373Если стек представляет исключение, *и* вызов функции возвращает истинное значение, эта информация «зануляется» и заменяется одним значением `WHY_SILENCED`, чтобы предотвратить повторное возбуждение исключения инструкцией `END_FINALLY`. (Но нелокальные переходы все равно будут возобновлены.)374375**`STORE_LOCALS`**376377Извлекает TOS из стека и сохраняет его как `f_locals` текущего фрейма. Используется при построении класса.378379Все следующие опкоды требуют аргументов. Аргумент занимает два байта, причём старший байт идёт последним.380381**`STORE_NAME`(*namei*)**382383Реализует `name = TOS`. *namei* – это индекс *name* в атрибуте `co_names` объекта кода. Компилятор старается использовать `STORE_FAST` или `STORE_GLOBAL`, если это возможно.384385**`DELETE_NAME`(*namei*)**386387Реализует `del name`, где *namei* – это индекс в атрибуте `co_names` объекта кода.388389**`UNPACK_SEQUENCE`(*count*)**390391Распаковывает TOS в *count* отдельных значений, которые помещаются в стек справа налево.392393**`UNPACK_EX`(*counts*)**394395Реализует присваивание с целевой переменной со звёздочкой: распаковывает итерируемый объект в TOS в отдельные значения, где общее количество значений может быть меньше количества элементов в итерируемом объекте: одно из новых значений будет списком всех оставшихся элементов.396397Младший байт *counts* – это количество значений до спискового значения, а старший байт *counts* – количество значений после него. Результирующие значения помещаются в стек справа налево.398399**`STORE_ATTR`(*namei*)**400401Реализует `TOS.name = TOS1`, где *namei* – это индекс имени в `co_names`.402403**`DELETE_ATTR`(*namei*)**404405Реализует `del TOS.name`, используя *namei* как индекс в `co_names`.406407**`STORE_GLOBAL`(*namei*)**408409Работает как `STORE_NAME`, но сохраняет имя как глобальное.410411**`DELETE_GLOBAL`(*namei*)**412413Работает как `DELETE_NAME`, но удаляет глобальное имя.414415**`LOAD_CONST`(*consti*)**416417Помещает `co_consts[consti]` в стек.418419**`LOAD_NAME`(*namei*)**420421Помещает значение, связанное с `co_names[namei]`, в стек.422423**`BUILD_TUPLE`(*count*)**424425Создает кортеж, беря *count* элементов из стека, и помещает полученный кортеж обратно в стек.426427**`BUILD_LIST`(*count*)**428429Работает как `BUILD_TUPLE`, но создает список.430431**`BUILD_SET`(*count*)**432433Работает как `BUILD_TUPLE`, но создает множество.434435**`BUILD_MAP`(*count*)**436437Помещает новый объект словаря в стек. Словарь предварительно настраивается на хранение *count* записей.438439**`LOAD_ATTR`(*namei*)**440441Заменяет TOS на `getattr(TOS, co_names[namei])`.442443**`COMPARE_OP`(*opname*)**444445Выполняет булеву операцию. Имя операции можно найти в `cmp_op[opname]`.446447**`IMPORT_NAME`(*namei*)**448449Импортирует модуль `co_names[namei]`. TOS и TOS1 извлекаются и предоставляют аргументы *fromlist* и *level* для [`__import__()`](https://python-all.ru/3.3/library/functions.html#__import__). Объект модуля помещается в стек. Текущее пространство имен не затрагивается: для правильного оператора import последующая инструкция `STORE_FAST` изменяет пространство имен.450451**`IMPORT_FROM`(*namei*)**452453Загружает атрибут `co_names[namei]` из модуля, находящегося в TOS. Полученный объект помещается в стек, чтобы затем быть сохраненным инструкцией `STORE_FAST`.454455**`JUMP_FORWARD`(*delta*)**456457Увеличивает счётчик байт-кода на *delta*.458459**`POP_JUMP_IF_TRUE`(*target*)**460461Если TOS истинно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.462463**`POP_JUMP_IF_FALSE`(*target*)**464465Если TOS ложно, устанавливает счётчик байткода в *target*. TOS извлекается из стека.466467**`JUMP_IF_TRUE_OR_POP`(*target*)**468469Если TOS истинно, устанавливает счетчик байткода в *target* и оставляет TOS в стеке. В противном случае (TOS ложно) TOS извлекается.470471**`JUMP_IF_FALSE_OR_POP`(*target*)**472473Если TOS ложен, устанавливает счетчик байт-кода в *target* и оставляет TOS на стеке. В противном случае (TOS истинен) TOS снимается со стека.474475**`JUMP_ABSOLUTE`(*target*)**476477Устанавливает счётчик байткода в *target*.478479**`FOR_ITER`(*delta*)**480481`TOS` – это [*итератор*](https://python-all.ru/3.3/glossary.html#term-iterator). Вызовите его метод [`__next__()`](https://python-all.ru/3.3/library/stdtypes.html#iterator.__next__). Если он возвращает новое значение, поместите его в стек (оставив итератор под ним). Если итератор сообщает, что он исчерпан, `TOS` снимается со стека, а счетчик байт-кода увеличивается на *delta*.482483**`LOAD_GLOBAL`(*namei*)**484485Загружает глобальную переменную с именем `co_names[namei]` в стек.486487**`SETUP_LOOP`(*delta*)**488489Помещает блок для цикла в стек блоков. Блок начинается с текущей инструкции и имеет размер *delta* байт.490491**`SETUP_EXCEPT`(*delta*)**492493Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на первый блок except.494495**`SETUP_FINALLY`(*delta*)**496497Помещает блок try из конструкции try-except в стек блоков. *delta* указывает на блок finally.498499**`STORE_MAP`**500501Сохраняет пару ключ-значение в словаре. Снимает со стека ключ и значение, оставляя словарь в стеке.502503**`LOAD_FAST`(*var\_num*)**504505Помещает ссылку на локальную переменную `co_varnames[var_num]` в стек.506507**`STORE_FAST`(*var\_num*)**508509Сохраняет TOS в локальную переменную `co_varnames[var_num]`.510511**`DELETE_FAST`(*var\_num*)**512513Удаляет локальную переменную `co_varnames[var_num]`.514515**`LOAD_CLOSURE`(*i*)**516517Помещает в стек ссылку на ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Имя переменной – `co_cellvars[i]`, если *i* меньше длины *co\_cellvars*. В противном случае – `co_freevars[i - len(co_cellvars)]`.518519**`LOAD_DEREF`(*i*)**520521Загружает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Помещает ссылку на объект, который содержит ячейка, в стек.522523**`STORE_DEREF`(*i*)**524525Сохраняет TOS в ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных.526527**`DELETE_DEREF`(*i*)**528529Опустошает ячейку, содержащуюся в слоте *i* хранилища ячеек и свободных переменных. Используется оператором [`del`](https://python-all.ru/3.3/reference/simple_stmts.html#del).530531**`RAISE_VARARGS`(*argc*)**532533Вызывает исключение. *argc* указывает количество параметров оператора raise (от 0 до 3). Обработчик увидит объект traceback как TOS2, параметр как TOS1, а исключение как TOS.534535**`CALL_FUNCTION`(*argc*)**536537Вызывает функцию. Младший байт *argc* указывает количество позиционных параметров, старший байт – количество именованных параметров. В стеке опкод сначала находит именованные параметры. Для каждого именованного аргумента значение находится поверх ключа. Под именованными параметрами в стеке располагаются позиционные параметры, причем самый правый параметр – наверху. Под параметрами находится вызываемый объект функции. Снимает со стека все аргументы функции и саму функцию, затем помещает в стек возвращаемое значение.538539**`MAKE_FUNCTION`(*argc*)**540541Помещает новый объект функции в стек. Снизу вверх, используемый стек должен состоять из542543- `argc & 0xFF` объекты аргументов по умолчанию в позиционном порядке.544- `(argc >> 8) & 0xFF` пары имя и аргумент по умолчанию, причём имя находится непосредственно под объектом в стеке, для параметров только по ключевым словам545- `(argc >> 16) & 0x7FFF` объекты аннотаций параметров546- кортеж, перечисляющий имена параметров для аннотаций (только если есть хотя бы один объект аннотации)547- код, связанный с функцией (на TOS1)548- [*полное имя*](https://python-all.ru/3.3/glossary.html#term-qualified-name) функции (на TOS)549550**`MAKE_CLOSURE`(*argc*)**551552Создает новый объект функции, устанавливает его слот *\_\_closure\_\_* и помещает его в стек. TOS – это [*квалифицированное имя*](https://python-all.ru/3.3/glossary.html#term-qualified-name) функции, TOS1 – это код, связанный с функцией, а TOS2 – это кортеж, содержащий ячейки для свободных переменных замыкания. Функция также имеет *argc* параметров по умолчанию, которые находятся ниже ячеек.553554**`BUILD_SLICE`(*argc*)**555556Помещает объект среза в стек. *argc* должен быть равен 2 или 3. Если он равен 2, помещается `slice(TOS1, TOS)`; если 3 – `slice(TOS2, TOS1, TOS)`. Подробнее см. встроенную функцию [`slice()`](https://python-all.ru/3.3/library/functions.html#slice).557558**`EXTENDED_ARG`(*ext*)**559560Является префиксом для любого опкода, аргумент которого слишком велик, чтобы поместиться в стандартные два байта. *ext* содержит два дополнительных байта, которые вместе с аргументом последующего опкода образуют четырехбайтовый аргумент, причем *ext* является двумя старшими байтами.561562**`CALL_FUNCTION_VAR`(*argc*)**563564Вызывает функцию. *argc* интерпретируется так же, как в `CALL_FUNCTION`. Верхний элемент стека содержит список аргументов переменной длины, за которым следуют именованные и позиционные аргументы.565566**`CALL_FUNCTION_KW`(*argc*)**567568Вызывает функцию. *argc* интерпретируется так же, как в `CALL_FUNCTION`. Верхний элемент в стеке содержит словарь именованных аргументов, за которым следуют явные именованные и позиционные аргументы.569570**`CALL_FUNCTION_VAR_KW`(*argc*)**571572Вызывает функцию. *argc* интерпретируется так же, как в `CALL_FUNCTION`. Верхний элемент в стеке содержит словарь именованных аргументов, за которым следуют кортеж переменных аргументов, а затем явные именованные и позиционные аргументы.573574**`HAVE_ARGUMENT`**575576Это не совсем опкод. Он обозначает разделительную линию между опкодами, не принимающими аргументы `< HAVE_ARGUMENT`, и теми, которые принимают `>= HAVE_ARGUMENT`.577