dis --- Python バイトコードの逆アセンブラー

ソースコード: Lib/dis.py


dis モジュールは、CPython の bytecode を逆アセンブルして解析するためのものです。 このモジュールが入力として受け取る CPython のバイトコードは Include/opcode.h で定義され、コンパイラとインタープリタで使われます。

バイトコードは CPython インタプリタの実装詳細です。Python のバージョン間でバイトコードの追加や、削除、変更がないという保証はありません。このモジュールを使用することによって Python の異なる VM または異なるリリースの間で動作すると考えるべきではありません。

バージョン 3.6 で変更: 従来は使用されるバイト数は命令ごとに異なりましたが、このモジュールでは各々一つの命令につき2バイト使用することとなっています。

バージョン 3.10 で変更: ジャンプ、例外処理、ループ命令の引数が、バイトオフセットではなく命令のオフセットになりました。

バージョン 3.11 で変更: 一部の命令には、CACHE 命令の形をした 1 つ以上のインラインキャッシュエントリーが付随するようになりました。 これらの命令はデフォルトでは非表示ですが、dis の各ユーティリティに show_caches=True を渡すと表示できます。 また、インタープリタは実行時の状況に応じてバイトコードを特殊化するようになりました。 この適応的なバイトコードは adaptive=True を渡すと表示できます。

バージョン 3.12 で変更: ジャンプの引数は、ジャンプ命令の CACHE エントリーの直後にある命令を基準とした、ジャンプ先の命令への相対オフセットになりました。

このため、前方ジャンプでは CACHE 命令の存在を意識する必要はありませんが、後方ジャンプを考える際は考慮する必要があります。

バージョン 3.13 で変更: ジャンプ先と例外ハンドラーの出力に、命令オフセットではなく論理ラベルを表示するようになりました。 -O コマンドラインオプションと show_offsets 引数を追加しました。

バージョン 3.14 で変更: -P コマンドラインオプションと show_positions 引数を追加しました。

-S コマンドラインオプションを追加しました。

例として、次の myfunc() 関数があるとします。

def myfunc(alist):
    return len(alist)

次のコマンドで myfunc() の逆アセンブル結果を表示できます:

>>> dis.dis(myfunc)
  2           RESUME                   0

  3           LOAD_GLOBAL              1 (len + NULL)
              LOAD_FAST_BORROW         0 (alist)
              CALL                     1
              RETURN_VALUE

("2" は行番号です)。

コマンドライン・インターフェース

dis モジュールはコマンドラインからスクリプトとして実行できます:

python -m dis [-h] [-C] [-O] [-P] [-S] [infile]

以下のオプションが使用できます:

-h, --help

使い方を表示して終了します。

-C, --show-caches

インラインキャッシュを表示します。

Added in version 3.13.

-O, --show-offsets

命令のオフセットを表示します。

Added in version 3.13.

-P, --show-positions

ソースコード内の命令の位置を表示します。

Added in version 3.14.

-S, --specialized

特殊化されたバイトコードを表示します。

Added in version 3.14.

infile を指定すると、その逆アセンブル結果を標準出力に書き出します。 指定しなければ、標準入力から受け取ったソースコードをコンパイルして逆アセンブルします。

バイトコード解析

Added in version 3.4.

バイトコード解析の API を使うと、 Python のコード片を Bytecode オブジェクトでラップでき、コンパイルされたコードの細かいところに簡単にアクセスできます。

class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

関数、ジェネレータ、非同期ジェネレータ、コルーチン、メソッド、ソースコード文字列、(compile() が返すような) コードオブジェクトに対応するバイトコードを解析します。

これは、下で並べられている関数の多くのものをまとめた便利なラッパーです。 とりわけ目立つのは get_instructions() で、 Bytecode インスタンスに対し反復処理をしながら、バイトコード命令を Instruction インスタンスとして返します。

first_line が None でない場合は、それを逆アセンブルしたコードのソースの最初の行に表示する行番号とします。 そうでない場合は、ソースの行の情報 (もしあれば) を逆アセンブルされたコードオブジェクトから直接取得します。

current_offset が None でない場合は、逆アセンブルされたコードでのあるインストラクションのオフセット位置を示します。 これを設定すると、 dis() の出力において、指定された命令コード (opcode) に "現在の命令 (instruction)" を表す印が表示されます。

show_caches が True なら、dis() はインタープリタがバイトコードの特殊化に使うインラインキャッシュエントリーを表示します。

adaptive が True なら、dis() は特殊化されたバイトコードを表示します。 これは元のバイトコードと異なる場合があります。

show_offsets が True なら、dis() の出力に命令オフセットを含めます。

show_positions が True なら、dis() の出力にソースコード内の命令の位置を含めます。

classmethod from_traceback(tb, *, show_caches=False)

与えられたトレースバックから Bytecode インスタンスを構築し、 current_offset がその例外の原因となった命令となるよう設定します。

codeobj

コンパイルされたコードオブジェクト。

first_line

コードオブジェクトのソースの最初の行 (利用可能であれば)

dis()

バイトコード命令の整形された表示を返します (dis.dis() と同じ出力になりますが、複数行文字列として返されます)。

info()

code_info() のようなコードオブジェクトの詳細を含んだ整形された複数行文字列を返します。

バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーターオブジェクトも扱えるようになりました。

バージョン 3.11 で変更: show_caches と adaptive パラメーターを追加しました。

バージョン 3.13 で変更: show_offsets パラメーターを追加しました。

バージョン 3.14 で変更: show_positions パラメーターを追加しました。

例:

>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
...     print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE

解析関数

dis モジュールは、入力を目的の出力に直接変換する、次の解析関数も定義しています。 1 つの操作だけを行うなど、中間の解析オブジェクトが不要な場合に便利です:

dis.code_info(x)

渡された関数、ジェネレータ、非同期ジェネレータ、コルーチン、メソッド、ソースコード文字列、コードオブジェクトに対する、詳細なコードオブジェクトの情報を、整形された複数行の文字列として返します。

この結果は実装に強く依存しており、Python VM や Python のバージョンによって異なることがあります。

Added in version 3.2.

バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーターオブジェクトも扱えるようになりました。

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

渡された関数、メソッド、ソースコード文字列、コードオブジェクトに対する、詳細なコードオブジェクトの情報を、file (または file が指定されていなければ sys.stdout) に表示します。

これは、インタラクティブシェル上で使うことを想定した、print(code_info(x), file=file) の便利なショートカットです。

Added in version 3.2.

バージョン 3.4 で変更: file 引数が追加されました。

dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

オブジェクト x を逆アセンブルします。 x にはモジュール、クラス、メソッド、関数、ジェネレーター、非同期ジェネレーター、コルーチン、コードオブジェクト、ソースコード文字列、生のバイトコードのバイト列を指定できます。 モジュールの場合はすべての関数を、クラスの場合はクラスメソッドと静的メソッドを含むすべてのメソッドを逆アセンブルします。 コードオブジェクトや生のバイトコードの列の場合は、バイトコード命令ごとに 1 行を表示します。 入れ子のコードオブジェクトも再帰的に逆アセンブルします。 これには、ジェネレーター式、入れ子の関数やクラスの本体、アノテーションスコープ で使うコードオブジェクトなどが含まれます。 文字列は、組み込み関数 compile() でコードオブジェクトにコンパイルしてから逆アセンブルします。 オブジェクトを指定しない場合は、最後のトレースバックを逆アセンブルします。

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

depth が None でなければ、再帰の最大の深さをその値に制限します。 depth=0 は再帰しないことを意味します。

show_caches が True なら、インタープリタがバイトコードの特殊化に使うインラインキャッシュエントリーを表示します。

adaptive が True なら、特殊化されたバイトコードを表示します。 これは元のバイトコードと異なる場合があります。

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.7 で変更: 再帰的な逆アセンブルを実装し、depth パラメーターを追加しました。

バージョン 3.7 で変更: コルーチンオブジェクトと非同期ジェネレーターオブジェクトも扱えるようになりました。

バージョン 3.11 で変更: show_caches と adaptive パラメーターを追加しました。

バージョン 3.13 で変更: show_offsets パラメーターを追加しました。

バージョン 3.14 で変更: show_positions パラメーターを追加しました。

dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)

トレースバックのスタックの先頭の関数を逆アセンブルします。Noneが渡された場合は最後のトレースバックを使います。例外を引き起こした命令が表示されます。

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.11 で変更: show_caches と adaptive パラメーターを追加しました。

バージョン 3.13 で変更: show_offsets パラメーターを追加しました。

バージョン 3.14 で変更: show_positions パラメーターを追加しました。

dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)
dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)

コードオブジェクトを逆アセンブルします。lasti が与えられた場合は、最後の命令を示します。出力は次のようなカラムに分割されます:

  1. ソースコード内の命令の位置。 show_positions が真なら完全な位置情報を表示します。 それ以外 (デフォルト) では行番号だけを表示します。

  2. 現在の命令。 --> として示されます。

  3. ラベル付けされた命令。 >> とともに表示されます。

  4. 命令のアドレス。

  5. 命令コード名。

  6. 命令パラメタ。

  7. パラメタの解釈を括弧で囲んだもの。

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

file 引数が渡された場合は、アセンブリをそこに書き込みます。 そうでない場合は sys.stdout に出力します。

バージョン 3.4 で変更: file 引数が追加されました。

バージョン 3.11 で変更: show_caches と adaptive パラメーターを追加しました。

バージョン 3.13 で変更: show_offsets パラメーターを追加しました。

バージョン 3.14 で変更: show_positions パラメーターを追加しました。

dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)

渡された関数、メソッド、ソースコード文字列、コードオブジェクトにある命令のイテレータを返します。

イテレータは、与えられたコードの各命令の詳細情報を保持する名前付きタプル Instruction からなる列を生成します。

first_line が None でない場合は、それを逆アセンブルしたコードのソースの最初の行に表示する行番号とします。 そうでない場合は、ソースの行の情報 (もしあれば) を逆アセンブルされたコードオブジェクトから直接取得します。

adaptive パラメーターは dis() のものと同じように動作します。

Added in version 3.4.

バージョン 3.11 で変更: show_caches と adaptive パラメーターを追加しました。

バージョン 3.13 で変更: show_caches パラメーターは非推奨となり、効果がなくなりました。 イテレーターは、show_caches の値にかかわらず cache_info フィールドを設定した Instruction インスタンスを生成し、キャッシュエントリーを個別の項目として生成しなくなりました。

dis.findlinestarts(code)

このジェネレーター関数は、コードオブジェクト code の co_lines() メソッドを使い、ソースコードの各行が始まるオフセットを調べます。 結果は (offset, lineno) ペアとして生成されます。

バージョン 3.6 で変更: 行番号が減少する場合もあるようになりました。 以前は常に増加していました。

バージョン 3.10 で変更: コードオブジェクト の co_firstlineno と codeobject.co_lnotab 属性に代わり、PEP 626 の co_lines() メソッドを使うようになりました。

バージョン 3.13 で変更: ソース行に対応しないバイトコードでは、行番号が None になる場合があります。

dis.findlabels(code)

生のコンパイル済みバイトコード文字列 code 内でジャンプ先となるすべてのオフセットを検出し、そのリストを返します。

dis.stack_effect(opcode, oparg=None, *, jump=None)

opcode と引数 oparg がスタックに与える影響を計算します。

命令にジャンプ先があり、jump が True なら、stack_effect() はジャンプした場合のスタックへの影響を返します。 jump が False なら、ジャンプしない場合の影響を返します。 jump が None (デフォルト) なら、両者のうち大きい方を返します。

Added in version 3.4.

バージョン 3.8 で変更: jump パラメーターを追加しました。

バージョン 3.13 で変更: oparg を省略するか None にすると、oparg=0 の場合のスタックへの影響を返すようになりました。 以前は、引数を使うオペコードに対してはエラーでした。 また、opcode が引数を使わない場合に整数の oparg を渡してもエラーにならず、oparg を無視するようになりました。

Python バイトコード命令

get_instructions() 関数と Bytecode クラスはバイトコード命令の詳細を Instruction インスタンスの形で提供します:

class dis.Instruction

バイトコード命令の詳細

opcode

以下の命令コードの値と 命令コードコレクション のバイトコードの値に対応する、命令の数値コードです。

opname

人間が読むための命令名

baseopcode

特殊化された命令の場合は基となる命令の数値コード。 それ以外は opcode と同じです。

baseopname

特殊化された命令の場合は基となる命令の、人間が読める名前。 それ以外は opname と同じです。

arg

(ある場合は) 命令の数値引数、無ければ None

oparg

arg の別名

argval

解決済みの引数値 (ある場合)。 ない場合は None

argrepr

命令の引数の、人間が読める説明 (ある場合)。 ない場合は空文字列。

offset

バイトコード列の中での命令の開始位置

start_offset

バイトコード列内で命令が始まるインデックス。 前に EXTENDED_ARG 命令が付く場合はそれを含め、付かない場合は offset と同じです。

cache_offset

命令に続くキャッシュエントリーの開始インデックス

end_offset

命令に続くキャッシュエントリーの終了インデックス

starts_line

このオペコードがソース行の先頭なら True、それ以外なら False

line_number

このオペコードに対応するソースの行番号 (ある場合)。 ない場合は None

is_jump_target

他のコードからここへジャンプする場合は True 、そうでない場合は False

jump_target

ジャンプ命令の場合はジャンプ先のバイトコードのインデックス。 それ以外は None

positions

この命令が対応する範囲の開始位置と終了位置を保持する dis.Positions オブジェクト。

cache_info

(name, size, data) 形式の 3 要素タプルで表した、この命令のキャッシュエントリーの情報。 name と size はキャッシュの形式を表し、data はキャッシュの内容です。 命令にキャッシュがなければ cache_info は None です。

Added in version 3.4.

バージョン 3.11 で変更: positions フィールドを追加しました。

バージョン 3.13 で変更: starts_line フィールドを変更しました。

start_offset、cache_offset、end_offset、baseopname、baseopcode、jump_target、oparg、line_number、cache_info フィールドを追加しました。

class dis.Positions

情報が取得できない場合、一部のフィールドは None になることがあります。

lineno
end_lineno
col_offset
end_col_offset

Added in version 3.11.

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

一般的な命令

以下ではインタープリタのスタックを STACK と呼び、Python のリストのように扱って操作を説明します。 この表記ではスタックの先頭は STACK[-1] に相当します。

NOP

何もしない命令です。 バイトコード最適化器のプレースホルダーや、行トレースイベントの生成に使います。

NOT_TAKEN

何もしない命令です。 インタープリタが sys.monitoring の BRANCH_LEFT と BRANCH_RIGHT イベントを記録するために使います。

Added in version 3.14.

POP_ITER

スタックの先頭からイテレーターを取り除きます。

Added in version 3.14.

POP_TOP

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

STACK.pop()
END_FOR

スタックの先頭の要素を取り除きます。 POP_TOP と同じです。 ループの終わりの後始末に使うことが名前の由来です。

Added in version 3.12.

END_SEND

del STACK[-2] を実行します。 ジェネレーターの終了時の後始末に使います。

Added in version 3.12.

COPY(i)

先頭から i 番目の要素を元の位置から取り除かず、スタックの先頭にプッシュします。

assert i > 0
STACK.append(STACK[-i])

Added in version 3.11.

SWAP(i)

スタックの先頭と、先頭から i 番目の要素を交換します。

STACK[-i], STACK[-1] = STACK[-1], STACK[-i]

Added in version 3.11.

CACHE

このオペコードは実際の命令ではなく、インタープリタが有用なデータをバイトコード自体にキャッシュするための追加領域を示します。 すべての dis ユーティリティで自動的に非表示になりますが、show_caches=True にすると表示できます。

論理的には、この領域は直前の命令の一部です。 多くのオペコードは決まった数のキャッシュが後続することを想定し、実行時にはインタープリタにそれらを読み飛ばさせます。

データの入ったキャッシュは任意の命令に見えることがあるため、高速化用データを含む生の適応的バイトコードを読み取ったり変更したりするときは、十分な注意が必要です。

Added in version 3.11.

1オペランド命令

1オペランド命令はスタックの先頭を取り出して操作を適用し、結果をスタックへプッシュし戻します。

UNARY_NEGATIVE

STACK[-1] = -STACK[-1] を実行します。

UNARY_NOT

STACK[-1] = not STACK[-1] を実行します。

バージョン 3.13 で変更: この命令は、厳密に bool 型の演算対象を要求するようになりました。

UNARY_INVERT

STACK[-1] = ~STACK[-1] を実行します。

GET_ITER

STACK[-1] = iter(STACK[-1]) を実行します。

GET_YIELD_FROM_ITER

STACK[-1] が generator iterator または coroutine オブジェクトなら、そのままにします。 それ以外は STACK[-1] = iter(STACK[-1]) を実行します。

Added in version 3.5.

TO_BOOL

STACK[-1] = bool(STACK[-1]) を実行します。

Added in version 3.13.

2 オペランド命令とインプレース命令

2 オペランド命令は、スタックの先頭 2 要素 (STACK[-1] と STACK[-2]) を取り出し、演算を行って結果をスタックに戻します。

インプレース命令は 2 オペランド命令に似ていますが、STACK[-2] が対応している場合はその場で演算を行います。 結果の STACK[-1] は元の STACK[-2] と同じオブジェクトになる場合がありますが、必ずそうなるわけではありません。

BINARY_OP(op)

op の値に応じた 2 オペランド演算子またはインプレース演算子を実装します。

rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)

Added in version 3.11.

バージョン 3.14 で変更: oparg が NB_SUBSCR の場合は、2 オペランドの添字参照を実行します (オペコード BINARY_SUBSCR に代わるものです)。

STORE_SUBSCR

次の処理を実行します。

key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
DELETE_SUBSCR

次の処理を実行します。

key = STACK.pop()
container = STACK.pop()
del container[key]
BINARY_SLICE

次の処理を実行します。

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])

Added in version 3.12.

STORE_SLICE

次の処理を実行します。

end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[start:end] = value

Added in version 3.12.

コルーチン命令コード

GET_AWAITABLE(where)

STACK[-1] = get_awaitable(STACK[-1]) を実行します。 ここで get_awaitable(o) は、o がコルーチンオブジェクトか CO_ITERABLE_COROUTINE フラグのあるジェネレーターオブジェクトなら o を返し、それ以外は o.__await__ を解決します。

where オペランドがゼロでなければ、命令が現れる場所を示します:

  • 1: __aenter__ の呼び出しの後

  • 2: __aexit__ の呼び出しの後

Added in version 3.5.

バージョン 3.11 で変更: 以前は、この命令に oparg はありませんでした。

GET_AITER

STACK[-1] = STACK[-1].__aiter__() を実行します。

Added in version 3.5.

バージョン 3.7 で変更: __aiter__ から awaitable オブジェクトを返すことは、サポートされなくなりました。

GET_ANEXT

STACK.append(get_awaitable(STACK[-1].__anext__())) を実行してスタックに追加します。 get_awaitable の詳細は GET_AWAITABLE を参照してください。

Added in version 3.5.

END_ASYNC_FOR

async for ループを終了します。 次の要素を await するときに送出された例外を処理します。 スタックの STACK[-2] には非同期イテラブル、STACK[-1] には送出された例外があり、両方をポップします。 例外が StopAsyncIteration でなければ再送出します。

Added in version 3.8.

バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1 要素になりました。

CLEANUP_THROW

現在のフレームを通じた throw() または close() の呼び出し中に送出された例外を処理します。 STACK[-1] が StopIteration のインスタンスなら、スタックから 3 つの値をポップして、その value メンバーをプッシュします。 それ以外は STACK[-1] を再送出します。

Added in version 3.12.

その他の命令コード

SET_ADD(i)

次の処理を実行します。

item = STACK.pop()
set.add(STACK[-i], item)

集合内包表記の実装に使います。

LIST_APPEND(i)

次の処理を実行します。

item = STACK.pop()
list.append(STACK[-i], item)

リスト内包表記の実装に使います。

MAP_ADD(i)

次の処理を実行します。

value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)

辞書内包表記の実装に使います。

Added in version 3.1.

バージョン 3.8 で変更: マッピングの値が STACK[-1]、キーが STACK[-2] になりました。 以前は逆でした。

SET_ADD, LIST_APPEND, MAP_ADD は、追加した値または key/value ペアをスタックから取り除きますが、コンテナオブジェクトはループの次のイテレーションで利用できるようにスタックに残しておきます。

RETURN_VALUE

STACK[-1] を返り値として、関数の呼び出し元に戻ります。

YIELD_VALUE

generator から STACK.pop() を yield します。

バージョン 3.11 で変更: oparg にスタックの深さを設定するようになりました。

バージョン 3.12 で変更: ジェネレーターを効率よく閉じるため、oparg に例外ブロックの深さを設定するようになりました。

バージョン 3.13 で変更: oparg は、この命令が yield from または await の一部なら 1、それ以外は 0 になりました。

SETUP_ANNOTATIONS

locals() に __annotations__ が定義されているかを確認し、なければ空の dict に設定します。 このオペコードは、クラスやモジュールの本体に 変数アノテーション が静的に含まれる場合にのみ生成されます。

Added in version 3.6.

POP_EXCEPT

スタックから値をポップし、例外の状態を復元するために使います。

バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1 要素になりました。

RERAISE

現在スタックの先頭にある例外を再送出します。 oparg がゼロでなければ、さらに値を 1 つポップし、現在のフレームの f_lasti を設定するために使います。

Added in version 3.9.

バージョン 3.11 で変更: スタック上の例外の表現が、3 要素ではなく 1 要素になりました。

PUSH_EXC_INFO

スタックから値を 1 つポップします。 現在の例外をスタックの先頭にプッシュし、最初にポップした値をスタックに戻します。 例外ハンドラーで使います。

Added in version 3.11.

CHECK_EXC_MATCH

except の例外の照合を行います。 STACK[-2] が STACK[-1] に一致する例外かを調べます。 STACK[-1] をポップし、照合結果の真偽値をプッシュします。

Added in version 3.11.

CHECK_EG_MATCH

except* の例外の照合を行います。 STACK[-2] が表す例外グループに split(STACK[-1]) を適用します。

一致した場合は、スタックから 2 要素をポップし、一致しないサブグループ (すべて一致した場合は None)、一致するサブグループの順にプッシュします。 一致しない場合は、1 要素 (照合する型) をポップし、None をプッシュします。

Added in version 3.11.

WITH_EXCEPT_START

スタックの先頭から 4 番目にある関数を、先頭の例外を表す引数 (type, val, tb) で呼び出します。 with 文で例外が起きたときの context_manager.__exit__(*exc_info()) の呼び出しを実装するために使います。

Added in version 3.9.

バージョン 3.11 で変更: __exit__ 関数の位置が、スタックの先頭から 7 番目ではなく 4 番目になりました。 スタック上の例外の表現が、3 要素ではなく 1 要素になりました。

LOAD_COMMON_CONSTANT

よく使う定数をスタックにプッシュします。 インタープリタには、この命令がサポートする定数の固定のリストがあります。 assert 文で AssertionError をロードするために使います。

Added in version 3.14.

LOAD_BUILD_CLASS

builtins.__build_class__() をスタックにプッシュします。 これは後でクラスを構築するために呼び出されます。

GET_LEN

STACK.append(len(STACK[-1])) を実行します。 パターンの構造との比較が必要な match 文で使います。

Added in version 3.10.

MATCH_MAPPING

STACK[-1] が collections.abc.Mapping のインスタンスなら (より厳密には、tp_flags に Py_TPFLAGS_MAPPING フラグが設定されていれば)、スタックに True をプッシュします。 それ以外は False をプッシュします。

Added in version 3.10.

MATCH_SEQUENCE

STACK[-1] が collections.abc.Sequence のインスタンスで、str/bytes/bytearray のインスタンスでは ない 場合 (より厳密には、tp_flags に Py_TPFLAGS_SEQUENCE フラグが設定されていれば)、スタックに True をプッシュします。 それ以外は False をプッシュします。

Added in version 3.10.

MATCH_KEYS

STACK[-1] はマッピングのキーのタプル、STACK[-2] は照合対象です。 STACK[-2] が STACK[-1] のすべてのキーを含んでいれば、対応する値を含む tuple をプッシュします。 それ以外は None をプッシュします。

Added in version 3.10.

バージョン 3.11 で変更: 以前は、成功 (True) または失敗 (False) を示す真偽値もプッシュしていました。

STORE_NAME(namei)

name = STACK.pop() を実行します。 namei は、コードオブジェクト の co_names 属性内の name のインデックスです。 コンパイラは、可能なら STORE_FAST または STORE_GLOBAL を使おうとします。

DELETE_NAME(namei)

del name を実行します。 namei は コードオブジェクト の co_names 属性内のインデックスです。

UNPACK_SEQUENCE(count)

STACK[-1] を count 個の値にアンパックし、右から左の順にスタックに置きます。 値はちょうど count 個でなければなりません。

assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
UNPACK_EX(counts)

星付きの代入先への代入を実装します。 STACK[-1] のイテラブルを個別の値にアンパックしますが、値の総数はイテラブルの要素数より少なくてもかまいません。 新しい値の 1 つは、残りの要素をすべて含むリストになります。

リストとなる値の前後の値の数は、それぞれ 255 個までに制限されています。

リストとなる値より前の値の数はオペコードの引数に符号化されます。 リストより後にも値がある場合、その数は EXTENDED_ARG を使って符号化されます。 したがって、引数は 2 バイトの値とみなせます。 counts の下位バイトがリストより前の値の数、上位バイトがリストより後の値の数です。

The extracted values are put onto the stack right-to-left, i.e. a, *b, c = d will be stored after execution as STACK.extend((a, b, c)).

STORE_ATTR(namei)

次の処理を実行します。

obj = STACK.pop()
value = STACK.pop()
obj.name = value

ここで namei は コードオブジェクト の co_names 内の name のインデックスです。

DELETE_ATTR(namei)

次の処理を実行します。

obj = STACK.pop()
del obj.name

ここで namei は コードオブジェクト の co_names 内の name のインデックスです。

STORE_GLOBAL(namei)

STORE_NAME と同じように動作しますが、 name をグローバルとして保存します。

DELETE_GLOBAL(namei)

DELETE_NAME と同じように動作しますが、グローバルの name を削除します。

LOAD_CONST(consti)

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

LOAD_SMALL_INT(i)

整数 i をスタックにプッシュします。 i は range(256) の範囲内でなければなりません。

Added in version 3.14.

LOAD_NAME(namei)

co_names[namei] に対応する値をスタックにプッシュします。 名前はローカル、グローバル、組み込みの順に探します。

LOAD_LOCALS

ローカル変数の辞書への参照をスタックにプッシュします。 LOAD_FROM_DICT_OR_DEREF と LOAD_FROM_DICT_OR_GLOBALS に渡す名前空間の辞書を準備するために使います。

Added in version 3.12.

LOAD_FROM_DICT_OR_GLOBALS(i)

スタックからマッピングをポップし、co_names[namei] の値を探します。 そこに名前がなければ、LOAD_GLOBAL と同様にグローバル、組み込みの順に探します。 クラス本体の アノテーションスコープ でグローバル変数をロードするために使います。

Added in version 3.12.

BUILD_TEMPLATE

文字列のタプルと補間のタプルから、新しい Template インスタンスを構築し、結果のオブジェクトをスタックにプッシュします。

interpolations = STACK.pop()
strings = STACK.pop()
STACK.append(_build_template(strings, interpolations))

Added in version 3.14.

BUILD_INTERPOLATION(format)

値とそのソースの式から新しい Interpolation インスタンスを構築し、結果のオブジェクトをスタックにプッシュします。

変換も書式指定もなければ、format は 2 に設定されます。

format の最下位ビットが立っていれば、補間に書式指定が含まれることを示します。

format >> 2 がゼロでなければ、補間に変換が含まれることを示します。 format >> 2 の値は変換の種類を表します (0 は変換なし、1 は !s、2 は !r、3 は !a)。

conversion = format >> 2
if format & 1:
    format_spec = STACK.pop()
else:
    format_spec = None
expression = STACK.pop()
value = STACK.pop()
STACK.append(_build_interpolation(value, expression, conversion, format_spec))

Added in version 3.14.

BUILD_TUPLE(count)

スタックから count 個の要素を取り出してタプルを作り、そのタプルをスタックにプッシュします。

if count == 0:
    value = ()
else:
    value = tuple(STACK[-count:])
    STACK = STACK[:-count]

STACK.append(value)
BUILD_LIST(count)

BUILD_TUPLE と同じように動作しますが、この命令はリストを作り出します。

BUILD_SET(count)

BUILD_TUPLE と同じように動作しますが、この命令は set を作り出します。

BUILD_MAP(count)

新しい辞書オブジェクトをスタックにプッシュします。 辞書が {..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]} という count 個のエントリーを持つように、2 * count 個の要素をポップします。

バージョン 3.5 で変更: count 個の要素を収容するサイズの空の辞書を作るのではなく、スタックの要素から辞書を作るようになりました。

BUILD_STRING(count)

スタックから count 個の文字列を連結し、結果の文字列をスタックにプッシュします。

Added in version 3.6.

LIST_EXTEND(i)

次の処理を実行します。

seq = STACK.pop()
list.extend(STACK[-i], seq)

リストの構築に使います。

Added in version 3.9.

SET_UPDATE(i)

次の処理を実行します。

seq = STACK.pop()
set.update(STACK[-i], seq)

集合の構築に使います。

Added in version 3.9.

DICT_UPDATE(i)

次の処理を実行します。

map = STACK.pop()
dict.update(STACK[-i], map)

辞書の構築に使います。

Added in version 3.9.

DICT_MERGE(i)

DICT_UPDATE と同じですが、キーが重複すると例外を送出します。

Added in version 3.9.

LOAD_ATTR(namei)

namei の最下位ビットが立っていなければ、STACK[-1] を getattr(STACK[-1], co_names[namei>>1]) に置き換えます。

If the low bit of namei is set, this will attempt to load a method named co_names[namei>>1] from the STACK[-1] object. STACK[-1] is popped. This bytecode distinguishes two cases: if STACK[-1] has a method with the correct name, the bytecode pushes the unbound method and STACK[-1]. STACK[-1] will be used as the first argument (self) by CALL or CALL_KW when calling the unbound method. Otherwise, NULL and the object returned by the attribute lookup are pushed.

バージョン 3.12 で変更: namei の最下位ビットが立っている場合、属性または非束縛メソッドより先に、それぞれ NULL または self をスタックにプッシュするようになりました。

LOAD_SUPER_ATTR(namei)

このオペコードは、引数なしと引数 2 つの両方の super() を実装します (例えば super().method()、super().attr、super(cls, self).method()、super(cls, self).attr)。

スタックの先頭から順に、次の 3 つの値をポップします:

  • self: 現在のメソッドの最初の引数

  • cls: 現在のメソッドを定義したクラス

  • グローバルの super

With respect to its argument, it works similarly to LOAD_ATTR, except that namei is shifted left by 2 bits instead of 1.

The low bit of namei signals to attempt a method load, as with LOAD_ATTR, which results in pushing NULL and the loaded method. When it is unset a single value is pushed to the stack.

namei の下から 2 番目のビットが立っていれば、引数 2 つの super() 呼び出しであることを示します (立っていなければ引数なしです)。

Added in version 3.12.

COMPARE_OP(opname)

Performs a Boolean operation. The operation name can be found in cmp_op[opname >> 5]. If the fifth-lowest bit of opname is set (opname & 16), the result should be coerced to bool.

バージョン 3.13 で変更: oparg の下から 5 番目のビットが、bool への強制変換を表すようになりました。

IS_OP(invert)

is による比較を行います。 invert が 1 なら is not による比較を行います。

Added in version 3.9.

CONTAINS_OP(invert)

in による比較を行います。 invert が 1 なら not in による比較を行います。

Added in version 3.9.

IMPORT_NAME(namei)

モジュール co_names[namei] をインポートします。 STACK[-1] と STACK[-2] をポップし、__import__() の fromlist と level 引数として使います。 モジュールオブジェクトをスタックにプッシュします。 現在の名前空間は変わりません。 通常の import 文では、後続の STORE_FAST 命令が名前空間を変更します。

IMPORT_FROM(namei)

STACK[-1] にあるモジュールから属性 co_names[namei] をロードします。 結果のオブジェクトをスタックにプッシュし、その後の STORE_FAST 命令で保存できるようにします。

JUMP_FORWARD(delta)

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

JUMP_BACKWARD(delta)

バイトコードカウンターを delta だけ減らします。 割り込みをチェックします。

Added in version 3.11.

JUMP_BACKWARD_NO_INTERRUPT(delta)

バイトコードカウンターを delta だけ減らします。 割り込みはチェックしません。

Added in version 3.11.

POP_JUMP_IF_TRUE(delta)

STACK[-1] が真なら、バイトコードカウンターを delta だけ増やします。 STACK[-1] はポップします。

バージョン 3.11 で変更: oparg は絶対位置のジャンプ先ではなく、相対的な差分になりました。 このオペコードは疑似命令となり、最終的なバイトコードでは方向 (前方/後方) ごとの命令に置き換えられます。

バージョン 3.12 で変更: 疑似命令ではなくなりました。

バージョン 3.13 で変更: この命令は、厳密に bool 型の演算対象を要求するようになりました。

POP_JUMP_IF_FALSE(delta)

STACK[-1] が偽なら、バイトコードカウンターを delta だけ増やします。 STACK[-1] はポップします。

バージョン 3.11 で変更: oparg は絶対位置のジャンプ先ではなく、相対的な差分になりました。 このオペコードは疑似命令となり、最終的なバイトコードでは方向 (前方/後方) ごとの命令に置き換えられます。

バージョン 3.12 で変更: 疑似命令ではなくなりました。

バージョン 3.13 で変更: この命令は、厳密に bool 型の演算対象を要求するようになりました。

POP_JUMP_IF_NOT_NONE(delta)

STACK[-1] が None でなければ、バイトコードカウンターを delta だけ増やします。 STACK[-1] はポップします。

Added in version 3.11.

バージョン 3.12 で変更: 疑似命令ではなくなりました。

POP_JUMP_IF_NONE(delta)

STACK[-1] が None なら、バイトコードカウンターを delta だけ増やします。 STACK[-1] はポップします。

Added in version 3.11.

バージョン 3.12 で変更: 疑似命令ではなくなりました。

FOR_ITER(delta)

STACK[-1] は iterator です。 その __next__() メソッドを呼び出します。 新しい値が得られれば、イテレーターを下に残したまま値をスタックにプッシュします。 イテレーターが exhausted になったことを示した場合は、バイトコードカウンターを delta だけ増やします。

バージョン 3.12 で変更: 3.11 までは、要素を使い切るとイテレーターをポップしていました。

LOAD_GLOBAL(namei)

co_names[namei>>1] という名前のグローバル変数をスタックにロードします。 namei の最下位ビットが立っている場合は、グローバル変数の後に NULL をプッシュします。

バージョン 3.11 で変更: namei の最下位ビットが、NULL をプッシュするかどうかを示すようになりました。

バージョン 3.13 で変更: NULL をグローバル変数の前ではなく、後にプッシュするようになりました。

LOAD_FAST(var_num)

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

バージョン 3.12 で変更: このオペコードは、ローカル変数が初期化されていることが保証される場合にのみ使うようになりました。 UnboundLocalError を送出することはありません。

LOAD_FAST_BORROW(var_num)

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

Added in version 3.14.

LOAD_FAST_LOAD_FAST(var_nums)

co_varnames[var_nums >> 4] と co_varnames[var_nums & 15] への参照をスタックにプッシュします。

Added in version 3.13.

LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)

co_varnames[var_nums >> 4] と co_varnames[var_nums & 15] への借用参照をスタックにプッシュします。

Added in version 3.14.

LOAD_FAST_CHECK(var_num)

ローカル変数 co_varnames[var_num] への参照をスタックにプッシュします。 変数が初期化されていなければ UnboundLocalError を送出します。

Added in version 3.12.

LOAD_FAST_AND_CLEAR(var_num)

ローカル変数 co_varnames[var_num] への参照をスタックにプッシュします (変数が初期化されていなければ NULL をプッシュします)。 そして co_varnames[var_num] を NULL に設定します。

Added in version 3.12.

STORE_FAST(var_num)

STACK.pop() をローカル変数 co_varnames[var_num] に保存します。

STORE_FAST_STORE_FAST(var_nums)

STACK[-1] を co_varnames[var_nums >> 4] に、STACK[-2] を co_varnames[var_nums & 15] に保存します。

Added in version 3.13.

STORE_FAST_LOAD_FAST(var_nums)

STACK.pop() をローカル変数 co_varnames[var_nums >> 4] に保存し、ローカル変数 co_varnames[var_nums & 15] への参照をスタックにプッシュします。

Added in version 3.13.

DELETE_FAST(var_num)

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

MAKE_CELL(i)

スロット i に新しいセルを作ります。 スロットが空でなければ、その値を新しいセルに保存します。

Added in version 3.11.

LOAD_DEREF(i)

"fast locals" 領域のスロット i にあるセルをロードします。 セルに入っているオブジェクトへの参照をスタックにプッシュします。

バージョン 3.11 で変更: i に co_varnames の長さをオフセットとして加えなくなりました。

LOAD_FROM_DICT_OR_DEREF(i)

スタックからマッピングをポップし、その中で "fast locals" 領域のスロット i に対応する名前を探します。 名前がなければ、LOAD_DEREF と同様にスロット i のセルからロードします。 クラス本体 (以前は LOAD_CLASSDEREF を使用) や、クラス本体の アノテーションスコープ で クロージャ変数 をロードするために使います。

Added in version 3.12.

STORE_DEREF(i)

STACK.pop() を "fast locals" 領域のスロット i にあるセルに保存します。

バージョン 3.11 で変更: i に co_varnames の長さをオフセットとして加えなくなりました。

DELETE_DEREF(i)

"fast locals" 領域のスロット i にあるセルを空にします。 del 文で使います。

Added in version 3.2.

バージョン 3.11 で変更: i に co_varnames の長さをオフセットとして加えなくなりました。

COPY_FREE_VARS(n)

クロージャからフレームへ、n 個の 自由 (クロージャ) 変数 をコピーします。 これにより、クロージャの呼び出し元で特別なコードを用意する必要がなくなります。

Added in version 3.11.

RAISE_VARARGS(argc)

argc の値に応じて、raise 文の 3 つの形式のいずれかで例外を送出します:

  • 0: raise (直前の例外を再送出)

  • 1: raise STACK[-1] (STACK[-1] の例外インスタンスまたは例外型を送出)

  • 2: raise STACK[-2] from STACK[-1] (__cause__ を STACK[-1] に設定し、STACK[-2] の例外インスタンスまたは例外型を送出)

CALL(argc)

argc で指定した数の引数で呼び出し可能オブジェクトを呼び出します。 スタックには下から上の順に次のものがあります:

  • 呼び出し可能オブジェクト

  • self または NULL

  • 残りの位置引数

argc は self を除いた位置引数の総数です。

CALL はすべての引数と呼び出し可能オブジェクトをスタックからポップし、それらの引数でオブジェクトを呼び出して、その返り値をスタックにプッシュします。

Added in version 3.11.

バージョン 3.13 で変更: 呼び出し可能オブジェクトが、常にスタック上の同じ位置に現れるようになりました。

バージョン 3.13 で変更: キーワード引数のある呼び出しは CALL_KW で処理するようになりました。

CALL_KW(argc)

1 つ以上の名前付き引数を含む、argc で指定した数の引数で呼び出し可能オブジェクトを呼び出します。 スタックには下から上の順に次のものがあります:

  • 呼び出し可能オブジェクト

  • self または NULL

  • 残りの位置引数

  • 名前付き引数

  • キーワード引数名の tuple

argc は self を除いた位置引数と名前付き引数の総数です。 キーワード引数名のタプルの長さが、名前付き引数の数です。

CALL_KW はすべての引数、キーワード名、呼び出し可能オブジェクトをスタックからポップし、それらの引数でオブジェクトを呼び出して、その返り値をスタックにプッシュします。

Added in version 3.13.

CALL_FUNCTION_EX(flags)

可変個の位置引数とキーワード引数で呼び出し可能オブジェクトを呼び出します。 flags の最下位ビットが立っている場合、スタックの先頭には追加のキーワード引数を含むマッピングオブジェクトがあります。 呼び出し前に、マッピングオブジェクトとイテラブルをそれぞれアンパックし、内容をキーワード引数と位置引数として渡します。 CALL_FUNCTION_EX はすべての引数と呼び出し可能オブジェクトをスタックからポップし、それらの引数でオブジェクトを呼び出して、その返り値をスタックにプッシュします。

Added in version 3.6.

PUSH_NULL

スタックに NULL をプッシュします。 メソッド以外の呼び出しで LOAD_ATTR がプッシュする NULL と呼び出し手順を揃えるために使います。

Added in version 3.11.

MAKE_FUNCTION

STACK[-1] にあるコードオブジェクトから新しい関数オブジェクトを作り、スタックにプッシュします。

バージョン 3.10 で変更: フラグ値 0x04 は、辞書ではなく文字列のタプルになりました。

バージョン 3.11 で変更: STACK[-1] にあった修飾名を取り除きました。

バージョン 3.13 で変更: oparg のフラグで指定していた、スタック上の追加の関数属性を取り除きました。 これらには SET_FUNCTION_ATTRIBUTE を使うようになりました。

SET_FUNCTION_ATTRIBUTE(flag)

関数オブジェクトの属性を設定します。 STACK[-1] に関数、STACK[-2] に設定する属性値があることを想定し、両方を取り出して関数を STACK[-1] に残します。 設定する属性はフラグで決まります:

  • 0x01 位置専用パラメーターと位置またはキーワードのパラメーターのデフォルト値を、位置の順に並べたタプル

  • 0x02 キーワード専用パラメーターのデフォルト値の辞書

  • 0x04 a tuple of strings containing parameters' annotations

  • 0x08 自由変数のセルを含み、クロージャを構成するタプル

  • 0x10 関数オブジェクトの annotate function

Added in version 3.13.

バージョン 3.14 で変更: 関数オブジェクトのアノテーション関数を示す 0x10 を追加しました。

BUILD_SLICE(argc)

スライスオブジェクトをスタックにプッシュします。 argc は 2 または 3 でなければなりません。 2 の場合は次の処理を行います。

end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end))

3 の場合は次の処理を行います。

step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))

詳しくは組み込み関数 slice() を参照してください。

EXTENDED_ARG(ext)

デフォルトの 1 バイトに収まらない大きさの引数を持つオペコードの前に付けます。 ext は、引数の上位ビットとなる追加の 1 バイトを保持します。 各オペコードの前には最大 3 つの EXTENDED_ARG を付けられ、2 バイトから 4 バイトの引数を構成できます。

CONVERT_VALUE(oparg)

oparg に応じて値を文字列に変換します。

value = STACK.pop()
result = func(value)
STACK.append(result)
  • oparg == 1: value に str() を適用します

  • oparg == 2: value に repr() を適用します

  • oparg == 3: value に ascii() を適用します

フォーマット済み文字列リテラル (f-string) の実装に使います。

Added in version 3.13.

FORMAT_SIMPLE

スタックの先頭の値を書式化します。

value = STACK.pop()
result = value.__format__("")
STACK.append(result)

フォーマット済み文字列リテラル (f-string) の実装に使います。

Added in version 3.13.

FORMAT_WITH_SPEC

指定された値を、指定された書式指定で書式化します。

spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)

フォーマット済み文字列リテラル (f-string) の実装に使います。

Added in version 3.13.

MATCH_CLASS(count)

STACK[-1] はキーワード属性名のタプル、STACK[-2] は照合に使うクラス、STACK[-3] は照合対象です。 count は位置によるサブパターンの数です。

STACK[-1]、STACK[-2]、STACK[-3] をポップします。 STACK[-3] が STACK[-2] のインスタンスで、count と STACK[-1] が要求する位置属性とキーワード属性を持っていれば、取り出した属性のタプルをプッシュします。 それ以外は None をプッシュします。

Added in version 3.10.

バージョン 3.11 で変更: 以前は、成功 (True) または失敗 (False) を示す真偽値もプッシュしていました。

RESUME(context)

何もしない命令です。 内部のトレース、デバッグ、最適化のためのチェックを行います。

context オペランドは 2 つの部分で構成されます。 下位 2 ビットは RESUME が現れる位置を示します:

  • 0 ジェネレーター、コルーチン、非同期ジェネレーターのいずれでもない関数の開始位置

  • 1 yield 式の後

  • 2 yield from 式の後

  • 3 await 式の後

その次のビットは、RESUME の例外処理の深さが 1 なら 1、それ以外なら 0 です。

Added in version 3.11.

バージョン 3.13 で変更: oparg の値に例外処理の深さの情報を含めるようになりました。

RETURN_GENERATOR

現在のフレームからジェネレーター、コルーチン、非同期ジェネレーターを作成します。 これらの呼び出し可能オブジェクトのコードオブジェクトで、最初のオペコードとして使います。 現在のフレームをクリアし、新しく作ったジェネレーターを返します。

Added in version 3.11.

SEND(delta)

STACK[-1] = STACK[-2].send(STACK[-1]) と同じです。 yield from と await 文で使います。

呼び出しが StopIteration を送出した場合、スタックの先頭の値をポップし、例外の value 属性をプッシュして、バイトコードカウンターを delta だけ増やします。

Added in version 3.11.

HAVE_ARGUMENT

これは実際にはオペコードではありません。 [0,255] の範囲のオペコードについて、引数を使わないもの (< HAVE_ARGUMENT) と使うもの (>= HAVE_ARGUMENT) の境界を示します。

アプリケーションで疑似命令や特殊化された命令を扱う場合は、代わりに hasarg コレクションを使ってください。

バージョン 3.6 で変更: すべての命令が引数を持つようになりましたが、< HAVE_ARGUMENT のオペコードは引数を無視します。 以前は >= HAVE_ARGUMENT のオペコードだけが引数を持っていました。

バージョン 3.12 で変更: dis モジュールに疑似命令を追加しました。 疑似命令では、HAVE_ARGUMENT との比較で引数を使うかどうかを判定することはできません。

バージョン 3.13 で非推奨: 代わりに hasarg を使ってください。

CALL_INTRINSIC_1

引数を 1 つ取る内部関数を呼び出します。 STACK[-1] を引数として渡し、結果を STACK[-1] に設定します。 性能が重要ではない機能の実装に使います。

どの内部関数を呼び出すかはオペランドで決まります:

オペランド

説明

INTRINSIC_1_INVALID

無効

INTRINSIC_PRINT

引数を標準出力に表示します。 REPL で使います。

INTRINSIC_IMPORT_STAR

指定された名前のモジュールに対して import * を実行します。

INTRINSIC_STOPITERATION_ERROR

Extracts the return value from a StopIteration exception.

INTRINSIC_ASYNC_GEN_WRAP

非同期ジェネレーターの値をラップします

INTRINSIC_UNARY_POSITIVE

単項 + 演算を行います

INTRINSIC_LIST_TO_TUPLE

リストをタプルに変換します

INTRINSIC_TYPEVAR

typing.TypeVar を作成します

INTRINSIC_PARAMSPEC

typing.ParamSpec を作成します

INTRINSIC_TYPEVARTUPLE

typing.TypeVarTuple を作成します

INTRINSIC_SUBSCRIPT_GENERIC

引数を添字とした typing.Generic を返します

INTRINSIC_TYPEALIAS

typing.TypeAliasType を作成します。 type 文で使います。 引数は、型エイリアスの名前、型パラメーター、値のタプルです。

Added in version 3.12.

CALL_INTRINSIC_2

引数を 2 つ取る内部関数を呼び出します。 性能が重要ではない機能の実装に使います。

arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)

どの内部関数を呼び出すかはオペランドで決まります:

オペランド

説明

INTRINSIC_2_INVALID

無効

INTRINSIC_PREP_RERAISE_STAR

try-except* から送出する ExceptionGroup を計算します。

INTRINSIC_TYPEVAR_WITH_BOUND

上限付きの typing.TypeVar を作成します。

INTRINSIC_TYPEVAR_WITH_CONSTRAINTS

制約付きの typing.TypeVar を作成します。

INTRINSIC_SET_FUNCTION_TYPE_PARAMS

関数の __type_params__ 属性を設定します。

Added in version 3.12.

LOAD_SPECIAL

STACK[-1] の特殊メソッドを検索します。 type(STACK[-1]).__xxx__ がメソッドなら、type(STACK[-1]).__xxx__; STACK[-1] をスタックに残します。 メソッドでなければ、STACK[-1].__xxx__; NULL をスタックに残します。

Added in version 3.14.

疑似命令

これらのオペコードは Python のバイトコードには現れません。 コンパイラが使用しますが、バイトコードを生成する前に実際のオペコードに置き換えられるか、取り除かれます。

SETUP_FINALLY(target)

後続のコードブロックの例外ハンドラーを設定します。 例外が発生すると、値スタックの深さを現在の状態に戻し、target の例外ハンドラーに制御を移します。

SETUP_CLEANUP(target)

SETUP_FINALLY と同じですが、例外発生時に最後の命令 (lasti) もスタックにプッシュし、RERAISE で復元できるようにします。 例外が発生すると、値スタックの深さとフレーム内の最後の命令を現在の状態に戻し、target の例外ハンドラーに制御を移します。

SETUP_WITH(target)

SETUP_CLEANUP と同じですが、例外発生時にスタックからさらに 1 要素をポップしてから、target の例外ハンドラーに制御を移します。

この変種は with と async with で使います。 これらの構文は、コンテキストマネージャの __enter__() または __aenter__() の返り値をスタックにプッシュします。

POP_BLOCK

直前の SETUP_FINALLY、SETUP_CLEANUP、SETUP_WITH に対応するコードブロックの終わりを示します。

JUMP
JUMP_NO_INTERRUPT

方向の指定のない相対ジャンプ命令です。 アセンブラーが、対応する方向 (前方/後方) の命令に置き換えます。

JUMP_IF_TRUE
JUMP_IF_FALSE

スタックを変更しない条件付きジャンプです。 COPY 1、TO_BOOL、POP_JUMP_IF_TRUE/FALSE の並びに置き換えます。

LOAD_CLOSURE(i)

"fast locals" 領域のスロット i にあるセルへの参照をスタックにプッシュします。

LOAD_CLOSURE はアセンブラーで LOAD_FAST に置き換えられます。

バージョン 3.13 で変更: このオペコードは疑似命令になりました。

命令コードコレクション

これらのコレクションは、自動でバイトコード命令を解析するために提供されています:

バージョン 3.12 で変更: これらのコレクションは、疑似命令と計測用命令も含むようになりました。 これらは、それぞれ >= MIN_PSEUDO_OPCODE と >= MIN_INSTRUMENTED_OPCODE の値を持つオペコードです。

dis.opname

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

dis.opmap

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

dis.cmp_op

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

dis.hasarg

引数を使うバイトコードのシーケンス。

Added in version 3.12.

dis.hasconst

定数にアクセスするバイトコードのリスト。

dis.hasfree

自由 (クロージャ) 変数 にアクセスするバイトコードのシーケンス。 ここで「自由」とは、内側のスコープから参照される現在のスコープの名前、または現在のスコープから参照される外側のスコープの名前を指します。 グローバルや組み込みのスコープへの参照は 含みません。

dis.hasname

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

dis.hasjump

ジャンプ先を持つバイトコードのシーケンス。 ジャンプはすべて相対ジャンプです。

Added in version 3.13.

dis.haslocal

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

dis.hascompare

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

dis.hasexc

例外ハンドラーを設定するバイトコードのシーケンス。

Added in version 3.12.

dis.hasjrel

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

バージョン 3.13 で非推奨: すべてのジャンプが相対ジャンプになりました。 hasjump を使ってください。

dis.hasjabs

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

バージョン 3.13 で非推奨: すべてのジャンプが相対ジャンプになりました。 このリストは空です。