32.12. dis — Python バイトコードの逆アセンブラ

Source code: Lib/dis.py


dis モジュールは CPython バイトコード (bytecode) を逆アセンブルすることでバイトコードの解析をサポートします。 このモジュールが入力として受け取る CPython バイトコードはファイル Include/opcode.h に定義されており、 コンパイラとインタプリタが使用しています。

CPython 実装の詳細: Bytecode is an implementation detail of the CPython interpreter. No guarantees are made that bytecode will not be added, removed, or changed between versions of Python. Use of this module should not be considered to work across Python VMs or Python releases.

バージョン 3.6 で変更: Use 2 bytes for each instruction. Previously the number of bytes varied by instruction.

例: 以下の関数 myfunc() を考えると

def myfunc(alist):
    return len(alist)

the following command can be used to display the disassembly of myfunc():

>>> dis.dis(myfunc)
  2           0 LOAD_GLOBAL              0 (len)
              2 LOAD_FAST                0 (alist)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

(「2」 は行番号です)。

32.12.1. Bytecode analysis

バージョン 3.4 で追加.

The bytecode analysis API allows pieces of Python code to be wrapped in a Bytecode object that provides easy access to details of the compiled code.

class dis.Bytecode(x, *, first_line=None, current_offset=None)

Analyse the bytecode corresponding to a function, generator, method, string of source code, or a code object (as returned by compile()).

This is a convenience wrapper around many of the functions listed below, most notably get_instructions(), as iterating over a Bytecode instance yields the bytecode operations as Instruction instances.

If first_line is not None, it indicates the line number that should be reported for the first source line in the disassembled code. Otherwise, the source line information (if any) is taken directly from the disassembled code object.

If current_offset is not None, it refers to an instruction offset in the disassembled code. Setting this means dis() will display a 「current instruction」 marker against the specified opcode.

classmethod from_traceback(tb)

Construct a Bytecode instance from the given traceback, setting current_offset to the instruction responsible for the exception.

codeobj

The compiled code object.

first_line

The first source line of the code object (if available)

dis()

Return a formatted view of the bytecode operations (the same as printed by dis.dis(), but returned as a multi-line string).

info()

Return a formatted multi-line string with detailed information about the code object, like code_info().

Example:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
LOAD_GLOBAL
LOAD_FAST
CALL_FUNCTION
RETURN_VALUE

32.12.2. Analysis functions

The dis module also defines the following analysis functions that convert the input directly to the desired output. They can be useful if only a single operation is being performed, so the intermediate analysis object isn’t useful:

dis.code_info(x)

Return a formatted multi-line string with detailed code object information for the supplied function, generator, method, source code string or code object.

Note that the exact contents of code info strings are highly implementation dependent and they may change arbitrarily across Python VMs or Python releases.

バージョン 3.2 で追加.

dis.show_code(x, *, file=None)

Print detailed code object information for the supplied function, method, source code string or code object to file (or sys.stdout if file is not specified).

This is a convenient shorthand for print(code_info(x), file=file), intended for interactive exploration at the interpreter prompt.

バージョン 3.2 で追加.

バージョン 3.4 で変更: Added file parameter.

dis.dis(x=None, *, file=None)

Disassemble the x object. x can denote either a module, a class, a method, a function, a generator, a code object, a string of source code or a byte sequence of raw bytecode. For a module, it disassembles all functions. For a class, it disassembles all methods (including class and static methods). For a code object or sequence of raw bytecode, it prints one line per bytecode instruction. Strings are first compiled to code objects with the compile() built-in function before being disassembled. If no object is provided, this function disassembles the last traceback.

The disassembly is written as text to the supplied file argument if provided and to sys.stdout otherwise.

バージョン 3.4 で変更: Added file parameter.

dis.distb(tb=None, *, file=None)

Disassemble the top-of-stack function of a traceback, using the last traceback if none was passed. The instruction causing the exception is indicated.

The disassembly is written as text to the supplied file argument if provided and to sys.stdout otherwise.

バージョン 3.4 で変更: Added file parameter.

dis.disassemble(code, lasti=-1, *, file=None)
dis.disco(code, lasti=-1, *, file=None)

Disassemble a code object, indicating the last instruction if lasti was provided. The output is divided in the following columns:

  1. 各行の最初の命令に対する行番号。
  2. 現在の命令。 --> として示されます。
  3. ラベル付けされた命令。 >> とともに表示されます。
  4. 命令のアドレス。
  5. 命令コード名。
  6. 命令パラメタ。
  7. パラメタの解釈を括弧で囲んだもの。

パラメタの解釈は、ローカル変数とグローバル変数の名前、定数の値、 分岐先、比較命令を認識します。

The disassembly is written as text to the supplied file argument if provided and to sys.stdout otherwise.

バージョン 3.4 で変更: Added file parameter.

dis.get_instructions(x, *, first_line=None)

Return an iterator over the instructions in the supplied function, method, source code string or code object.

The iterator generates a series of Instruction named tuples giving the details of each operation in the supplied code.

If first_line is not None, it indicates the line number that should be reported for the first source line in the disassembled code. Otherwise, the source line information (if any) is taken directly from the disassembled code object.

バージョン 3.4 で追加.

dis.findlinestarts(code)

This generator function uses the co_firstlineno and co_lnotab attributes of the code object code to find the offsets which are starts of lines in the source code. They are generated as (offset, lineno) pairs. See Objects/lnotab_notes.txt for the co_lnotab format and how to decode it.

バージョン 3.6 で変更: Line numbers can be decreasing. Before, they were always increasing.

dis.findlabels(code)

ジャンプ先であるコードオブジェクト code のすべてのオフセットを 求め、これらのオフセットのリストを返します。

dis.stack_effect(opcode[, oparg])

Compute the stack effect of opcode with argument oparg.

バージョン 3.4 で追加.

32.12.3. Python バイトコード命令

The get_instructions() function and Bytecode class provide details of bytecode instructions as Instruction instances:

class dis.Instruction

Details for a bytecode operation

opcode

numeric code for operation, corresponding to the opcode values listed below and the bytecode values in the Opcode collections.

opname

human readable name for operation

arg

numeric argument to operation (if any), otherwise None

argval

resolved arg value (if known), otherwise same as arg

argrepr

human readable description of operation argument

offset

start index of operation within bytecode sequence

starts_line

line started by this opcode (if any), otherwise None

is_jump_target

True if other code jumps to here, otherwise False

バージョン 3.4 で追加.

現在 Python コンパイラは次のバイトコード命令を生成します。

General instructions

NOP

なにもしないコード。バイトコードオプティマイザでプレースホルダとして使われます。

POP_TOP

スタックの先頭 (TOS) の要素を取り除きます。

ROT_TWO

スタックの先頭の 2 つの要素を入れ替えます。

ROT_THREE

スタックの二番目と三番目の要素の位置を 1 つ上げ、先頭を三番目へ下げます。

DUP_TOP

スタックの先頭にある参照の複製を作ります。

DUP_TOP_TWO

Duplicates the two references on top of the stack, leaving them in the same order.

Unary operations

Unary operations take the top of the stack, apply the operation, and push the result back on the stack.

UNARY_POSITIVE

TOS = +TOS に対応します。

UNARY_NEGATIVE

TOS = -TOS に対応します。

UNARY_NOT

TOS = not TOS に対応します。

UNARY_INVERT

TOS = ~TOS に対応します。

GET_ITER

TOS = iter(TOS) に対応します。

GET_YIELD_FROM_ITER

If TOS is a generator iterator or coroutine object it is left as is. Otherwise, implements TOS = iter(TOS).

バージョン 3.5 で追加.

Binary operations

二項命令はスタックの先頭 (TOS) と先頭から二番目の要素をスタックから取り除きます。 命令を実行し、スタックへ結果をプッシュし戻します。

BINARY_POWER

TOS = TOS1 ** TOS に対応します。

BINARY_MULTIPLY

TOS = TOS1 * TOS に対応します。

BINARY_MATRIX_MULTIPLY

Implements TOS = TOS1 @ TOS.

バージョン 3.5 で追加.

BINARY_FLOOR_DIVIDE

TOS = TOS1 // TOS に対応します。

BINARY_TRUE_DIVIDE

Implements TOS = TOS1 / TOS.

BINARY_MODULO

TOS = TOS1 % TOS に対応します。

BINARY_ADD

TOS = TOS1 + TOS に対応します。

BINARY_SUBTRACT

TOS = TOS1 - TOS に対応します。

BINARY_SUBSCR

TOS = TOS1[TOS] に対応します。

BINARY_LSHIFT

TOS = TOS1 << TOS に対応します。

BINARY_RSHIFT

TOS = TOS1 >> TOS に対応します。

BINARY_AND

TOS = TOS1 & TOS に対応します。

BINARY_XOR

TOS = TOS1 ^ TOS に対応します。

BINARY_OR

TOS = TOS1 | TOS に対応します。

In-place operations

インプレース命令は TOS と TOS1 を取り除いて結果をスタックへプッシュするという点で二項命令と似ています。 しかし、TOS1 がインプレース命令をサポートしている場合には操作が直接 TOS1 に行われます。 また、操作結果の TOS は (常に同じというわけではありませんが) 元の TOS1 と同じオブジェクトになることが多いです。

INPLACE_POWER

インプレースの TOS = TOS1 ** TOS に対応します。

INPLACE_MULTIPLY

インプレースの TOS = TOS1 * TOS に対応します。

INPLACE_MATRIX_MULTIPLY

Implements in-place TOS = TOS1 @ TOS.

バージョン 3.5 で追加.

INPLACE_FLOOR_DIVIDE

インプレースの TOS = TOS1 // TOS に対応します。

INPLACE_TRUE_DIVIDE

Implements in-place TOS = TOS1 / TOS.

INPLACE_MODULO

インプレースの TOS = TOS1 % TOS に対応します。

INPLACE_ADD

インプレースの TOS = TOS1 + TOS に対応します。

INPLACE_SUBTRACT

インプレースの TOS = TOS1 - TOS に対応します。

INPLACE_LSHIFT

インプレースの TOS = TOS1 << TOS に対応します。

INPLACE_RSHIFT

インプレースの TOS = TOS1 >> TOS に対応します。

INPLACE_AND

インプレースの TOS = TOS1 & TOS に対応します。

INPLACE_XOR

インプレースの TOS = TOS1 ^ TOS に対応します。

INPLACE_OR

インプレースの TOS = TOS1 | TOS に対応します。

STORE_SUBSCR

TOS1[TOS] = TOS2 に対応します。

DELETE_SUBSCR

del TOS1[TOS] に対応します。

Coroutine opcodes

GET_AWAITABLE

Implements TOS = get_awaitable(TOS), where get_awaitable(o) returns o if o is a coroutine object or a generator object with the CO_ITERABLE_COROUTINE flag, or resolves o.__await__.

GET_AITER

Implements TOS = get_awaitable(TOS.__aiter__()). See GET_AWAITABLE for details about get_awaitable

GET_ANEXT

Implements PUSH(get_awaitable(TOS.__anext__())). See GET_AWAITABLE for details about get_awaitable

BEFORE_ASYNC_WITH

Resolves __aenter__ and __aexit__ from the object on top of the stack. Pushes __aexit__ and result of __aenter__() to the stack.

SETUP_ASYNC_WITH

Creates a new frame object.

Miscellaneous opcodes

PRINT_EXPR

対話モードのための式文に対応します。TOS はスタックから取り除かれ表示されます。 非対話モードにおいては、式文は POP_TOP で終了しています。

BREAK_LOOP

break 文によってループを終了します。

CONTINUE_LOOP(target)

continue 文によってループを継続します。 target はジャンプするアドレスです (アドレスは FOR_ITER 命令でなければなりません)。

SET_ADD(i)

Calls set.add(TOS1[-i], TOS). Used to implement set comprehensions.

LIST_APPEND(i)

Calls list.append(TOS[-i], TOS). Used to implement list comprehensions.

MAP_ADD(i)

Calls dict.setitem(TOS1[-i], TOS, TOS1). Used to implement dict comprehensions.

For all of the SET_ADD, LIST_APPEND and MAP_ADD instructions, while the added value or key/value pair is popped off, the container object remains on the stack so that it is available for further iterations of the loop.

RETURN_VALUE

関数の呼び出し元へ TOS を返します。

YIELD_VALUE

Pops TOS and yields it from a generator.

YIELD_FROM

Pops TOS and delegates to it as a subiterator from a generator.

バージョン 3.3 で追加.

SETUP_ANNOTATIONS

Checks whether __annotations__ is defined in locals(), if not it is set up to an empty dict. This opcode is only emitted if a class or module body contains variable annotations statically.

バージョン 3.6 で追加.

IMPORT_STAR

'_' で始まっていないすべてのシンボルをモジュール TOS から直接ローカル名前空間へロードします。 モジュールはすべての名前をロードした後にポップされます。 この命令コードは from module import * に対応します。

POP_BLOCK

ブロックスタックからブロックを一つ取り除きます。 フレームごとにブロックのスタックがあり、ネストしたループや try 文などを表しています。

POP_EXCEPT

Removes one block from the block stack. The popped block must be an exception handler block, as implicitly created when entering an except handler. In addition to popping extraneous values from the frame stack, the last three popped values are used to restore the exception state.

END_FINALLY

finally 節を終了します。 インタプリタは例外を再送出しなければならないかどうか、あるいは、 関数から return して外側の次のブロックに続くかどうかを再度判断します。

LOAD_BUILD_CLASS

Pushes builtins.__build_class__() onto the stack. It is later called by CALL_FUNCTION to construct a class.

SETUP_WITH(delta)

この命令コードは、with ブロックが開始する前にいくつかの命令を行います。 まず、コンテキストマネージャから __exit__() をロードし、 後から WITH_CLEANUP で使うためにスタックにプッシュします。 そして、 __enter__() が呼び出され、 delta を指す finally ブロックがプッシュされます。最後に、enter メソッドを呼び出した 結果がスタックにプッシュされます。次の命令コードはこれを無視 (POP_TOP) するか、変数に保存 (STORE_FAST, STORE_NAME, または UNPACK_SEQUENCE) します。

WITH_CLEANUP_START

Cleans up the stack when a with statement block exits. TOS is the context manager’s __exit__() bound method. Below TOS are 1–3 values indicating how/why the finally clause was entered:

  • SECOND = None
  • (SECOND, THIRD) = (WHY_{RETURN,CONTINUE}), retval
  • SECOND = WHY_*; no retval below it
  • (SECOND, THIRD, FOURTH) = exc_info()

In the last case, TOS(SECOND, THIRD, FOURTH) is called, otherwise TOS(None, None, None). Pushes SECOND and result of the call to the stack.

WITH_CLEANUP_FINISH

Pops exception type and result of 『exit』 function call from the stack.

If the stack represents an exception, and the function call returns a 『true』 value, this information is 「zapped」 and replaced with a single WHY_SILENCED to prevent END_FINALLY from re-raising the exception. (But non-local gotos will still be resumed.)

All of the following opcodes use their arguments.

STORE_NAME(namei)

Implements name = TOS. namei is the index of name in the attribute co_names of the code object. The compiler tries to use STORE_FAST or STORE_GLOBAL if possible.

DELETE_NAME(namei)

del name に対応します。 namei はコードオブジェクトの co_names 属性へのインデクスです。

UNPACK_SEQUENCE(count)

TOS を count 個の個別の値にアンパックして、右から左の順にスタックに置きます。

UNPACK_EX(counts)

Implements assignment with a starred target: Unpacks an iterable in TOS into individual values, where the total number of values can be smaller than the number of items in the iterable: one of the new values will be a list of all leftover items.

The low byte of counts is the number of values before the list value, the high byte of counts the number of values after it. The resulting values are put onto the stack right-to-left.

STORE_ATTR(namei)

TOS.name = TOS1 に対応します。 nameico_names における名前のインデクスです。

DELETE_ATTR(namei)

del TOS.name に対応します。 co_names へのインデクスとして namei を使います。

STORE_GLOBAL(namei)

Works as STORE_NAME, but stores the name as a global.

DELETE_GLOBAL(namei)

Works as DELETE_NAME, but deletes a global name.

LOAD_CONST(consti)

co_consts[consti] をスタックにプッシュします。

LOAD_NAME(namei)

co_names[namei] に関連付けられた値をスタックにプッシュします。

BUILD_TUPLE(count)

スタックから count 個の要素を消費してタプルを作り出し、できたタプルをスタックにプッシュします。

BUILD_LIST(count)

Works as BUILD_TUPLE, but creates a list.

BUILD_SET(count)

Works as BUILD_TUPLE, but creates a set.

BUILD_MAP(count)

Pushes a new dictionary object onto the stack. Pops 2 * count items so that the dictionary holds count entries: {..., TOS3: TOS2, TOS1: TOS}.

バージョン 3.5 で変更: The dictionary is created from stack items instead of creating an empty dictionary pre-sized to hold count items.

BUILD_CONST_KEY_MAP(count)

The version of BUILD_MAP specialized for constant keys. count values are consumed from the stack. The top element on the stack contains a tuple of keys.

バージョン 3.6 で追加.

BUILD_STRING(count)

Concatenates count strings from the stack and pushes the resulting string onto the stack.

バージョン 3.6 で追加.

BUILD_TUPLE_UNPACK(count)

Pops count iterables from the stack, joins them in a single tuple, and pushes the result. Implements iterable unpacking in tuple displays (*x, *y, *z).

バージョン 3.5 で追加.

BUILD_TUPLE_UNPACK_WITH_CALL(count)

This is similar to BUILD_TUPLE_UNPACK, but is used for f(*x, *y, *z) call syntax. The stack item at position count + 1 should be the corresponding callable f.

バージョン 3.6 で追加.

BUILD_LIST_UNPACK(count)

This is similar to BUILD_TUPLE_UNPACK, but pushes a list instead of tuple. Implements iterable unpacking in list displays [*x, *y, *z].

バージョン 3.5 で追加.

BUILD_SET_UNPACK(count)

This is similar to BUILD_TUPLE_UNPACK, but pushes a set instead of tuple. Implements iterable unpacking in set displays {*x, *y, *z}.

バージョン 3.5 で追加.

BUILD_MAP_UNPACK(count)

Pops count mappings from the stack, merges them into a single dictionary, and pushes the result. Implements dictionary unpacking in dictionary displays {**x, **y, **z}.

バージョン 3.5 で追加.

BUILD_MAP_UNPACK_WITH_CALL(count)

This is similar to BUILD_MAP_UNPACK, but is used for f(**x, **y, **z) call syntax. The stack item at position count + 2 should be the corresponding callable f.

バージョン 3.5 で追加.

バージョン 3.6 で変更: The position of the callable is determined by adding 2 to the opcode argument instead of encoding it in the second byte of the argument.

LOAD_ATTR(namei)

TOS を getattr(TOS, co_names[namei]) と入れ替えます。

COMPARE_OP(opname)

ブール命令を実行します。命令名は cmp_op[opname] にあります。

IMPORT_NAME(namei)

Imports the module co_names[namei]. TOS and TOS1 are popped and provide the fromlist and level arguments of __import__(). The module object is pushed onto the stack. The current namespace is not affected: for a proper import statement, a subsequent STORE_FAST instruction modifies the namespace.

IMPORT_FROM(namei)

Loads the attribute co_names[namei] from the module found in TOS. The resulting object is pushed onto the stack, to be subsequently stored by a STORE_FAST instruction.

JUMP_FORWARD(delta)

バイトコードカウンタを delta だけ増加させます。

POP_JUMP_IF_TRUE(target)

TOS が真ならば、バイトコードカウンタを target に設定します。 TOS はポップされます。

POP_JUMP_IF_FALSE(target)

TOS が偽ならば、バイトコードカウンタを target に設定します。 TOS はポップされます。

JUMP_IF_TRUE_OR_POP(target)

TOS が真ならば、バイトコードカウンタを target に設定し、TOS は スタックに残されます。そうでない (TOS が偽) なら、TOS はポップされます。

JUMP_IF_FALSE_OR_POP(target)

TOS が偽ならば、バイトコードカウンタを target に設定し、TOS は スタックに残されます。そうでない (TOS が真) なら、TOS はポップされます。

JUMP_ABSOLUTE(target)

バイトコードカウンタを target に設定します。

FOR_ITER(delta)

TOS is an iterator. Call its __next__() method. If this yields a new value, push it on the stack (leaving the iterator below it). If the iterator indicates it is exhausted TOS is popped, and the byte code counter is incremented by delta.

LOAD_GLOBAL(namei)

co_names[namei] という名前のグローバルをスタック上にロードします。

SETUP_LOOP(delta)

ループのためのブロックをブロックスタックにプッシュします。 ブロックは現在の命令から delta バイトの大きさを占めます。

SETUP_EXCEPT(delta)

try-except 節から try ブロックをブロックスタックにプッシュします。 delta は最初の except ブロックを指します。

SETUP_FINALLY(delta)

try-except 節から try ブロックをブロックスタックにプッシュします。 delta は finally ブロックを指します。

LOAD_FAST(var_num)

ローカルな co_varnames[var_num] への参照をスタックにプッシュします。

STORE_FAST(var_num)

TOS をローカルな co_varnames[var_num] の中に保存します。

DELETE_FAST(var_num)

ローカルな co_varnames[var_num] を削除します。

STORE_ANNOTATION(namei)

Stores TOS as locals()['__annotations__'][co_names[namei]] = TOS.

バージョン 3.6 で追加.

LOAD_CLOSURE(i)

セルと自由変数の記憶領域のスロット i に含まれるセルへの参照をプッシュします。 ico_cellvars の長さより小さければ、変数の名前は co_cellvars[i] です。 そうでなければ co_freevars[i - len(co_cellvars)] です。

LOAD_DEREF(i)

セルと自由変数の記憶領域のスロット i に含まれるセルをロードします。 セルが持つオブジェクトへの参照をスタックにプッシュします。

LOAD_CLASSDEREF(i)

Much like LOAD_DEREF but first checks the locals dictionary before consulting the cell. This is used for loading free variables in class bodies.

STORE_DEREF(i)

セルと自由変数の記憶領域のスロット i に含まれるセルへTOSを保存します。

DELETE_DEREF(i)

Empties the cell contained in slot i of the cell and free variable storage. Used by the del statement.

RAISE_VARARGS(argc)

例外を発生させます。 argc は raise 文へ与えるパラメタの数を 0 から 3 の 範囲で示します。 ハンドラは TOS2 をトレースバック、TOS1 をパラメタ、TOS を例外として探します。

CALL_FUNCTION(argc)

Calls a function. argc indicates the number of positional arguments. The positional arguments are on the stack, with the right-most argument on top. Below the arguments, the function object to call is on the stack. Pops all function arguments, and the function itself off the stack, and pushes the return value.

バージョン 3.6 で変更: This opcode is used only for calls with positional arguments.

CALL_FUNCTION_KW(argc)

Calls a function. argc indicates the number of arguments (positional and keyword). The top element on the stack contains a tuple of keyword argument names. Below the tuple, keyword arguments are on the stack, in the order corresponding to the tuple. Below the keyword arguments, the positional arguments are on the stack, with the right-most parameter on top. Below the arguments, the function object to call is on the stack. Pops all function arguments, and the function itself off the stack, and pushes the return value.

バージョン 3.6 で変更: Keyword arguments are packed in a tuple instead of a dictionary, argc indicates the total number of arguments

CALL_FUNCTION_EX(flags)

Calls a function. The lowest bit of flags indicates whether the var-keyword argument is placed at the top of the stack. Below the var-keyword argument, the var-positional argument is on the stack. Below the arguments, the function object to call is placed. Pops all function arguments, and the function itself off the stack, and pushes the return value. Note that this opcode pops at most three items from the stack. Var-positional and var-keyword arguments are packed by BUILD_TUPLE_UNPACK_WITH_CALL and BUILD_MAP_UNPACK_WITH_CALL.

バージョン 3.6 で追加.

MAKE_FUNCTION(argc)

Pushes a new function object on the stack. From bottom to top, the consumed stack must consist of values if the argument carries a specified flag value

  • 0x01 a tuple of default argument objects in positional order
  • 0x02 a dictionary of keyword-only parameters』 default values
  • 0x04 an annotation dictionary
  • 0x08 a tuple containing cells for free variables, making a closure
  • the code associated with the function (at TOS1)
  • the qualified name of the function (at TOS)
BUILD_SLICE(argc)

スライスオブジェクトをスタックにプッシュします。 argc は2あるいは3でなければなりません。 2 ならば slice(TOS1, TOS) がプッシュされます。 3 ならば slice(TOS2, TOS1, TOS) がプッシュされます。 これ以上の情報については、 slice() 組み込み関数を参照してください。

EXTENDED_ARG(ext)

デフォルトの 2 バイトに収まりきらない大きな引数を持つあらゆる命令コードの前に置かれます。 ext は追加の 2 バイトを保持し、後続の命令コードの引数と組み合わされます。 それらは 4 バイト引数を構成し、 ext はその最上位バイトです。

FORMAT_VALUE(flags)

Used for implementing formatted literal strings (f-strings). Pops an optional fmt_spec from the stack, then a required value. flags is interpreted as follows:

  • (flags & 0x03) == 0x00: value is formatted as-is.
  • (flags & 0x03) == 0x01: call str() on value before formatting it.
  • (flags & 0x03) == 0x02: call repr() on value before formatting it.
  • (flags & 0x03) == 0x03: call ascii() on value before formatting it.
  • (flags & 0x04) == 0x04: pop fmt_spec from the stack and use it, else use an empty fmt_spec.

Formatting is performed using PyObject_Format(). The result is pushed on the stack.

バージョン 3.6 で追加.

HAVE_ARGUMENT

This is not really an opcode. It identifies the dividing line between opcodes which don’t use their argument and those that do (< HAVE_ARGUMENT and >= HAVE_ARGUMENT, respectively).

バージョン 3.6 で変更: Now every instruction has an argument, but opcodes < HAVE_ARGUMENT ignore it. Before, only opcodes >= HAVE_ARGUMENT had an argument.

32.12.4. Opcode collections

These collections are provided for automatic introspection of bytecode instructions:

dis.opname

命令コード名のリスト。バイトコードをインデクスに使って参照できます。

dis.opmap

命令コード名をバイトコードに対応づける辞書。

dis.cmp_op

すべての比較命令の名前のリスト。

dis.hasconst

定数パラメタを持つバイトコードのリスト。

dis.hasfree

Sequence of bytecodes that access a free variable (note that 『free』 in this context refers to names in the current scope that are referenced by inner scopes or names in outer scopes that are referenced from this scope. It does not include references to global or builtin scopes).

dis.hasname

名前によって属性にアクセスするバイトコードのリスト。

dis.hasjrel

相対ジャンプ先を持つバイトコードのリスト。

dis.hasjabs

絶対ジャンプ先を持つバイトコードのリスト。

dis.haslocal

ローカル変数にアクセスするバイトコードのリスト。

dis.hascompare

ブール命令のバイトコードのリスト。