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 引数を追加しました。
例として、次の 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¶
コードオブジェクトのソースの最初の行 (利用可能であれば)
- 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 が与えられた場合は、最後の命令を示します。出力は次のようなカラムに分割されます:
ソースコード内の命令の位置。 show_positions が真なら完全な位置情報を表示します。 それ以外 (デフォルト) では行番号だけを表示します。
現在の命令。
-->として示されます。ラベル付けされた命令。
>>とともに表示されます。命令のアドレス。
命令コード名。
命令パラメタ。
パラメタの解釈を括弧で囲んだもの。
パラメタの解釈は、ローカル変数とグローバル変数の名前、定数の値、 分岐先、比較命令を認識します。
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¶
人間が読むための命令名
- arg¶
(ある場合は) 命令の数値引数、無ければ
None
- argval¶
解決済みの引数値 (ある場合)。 ない場合は
None
- argrepr¶
命令の引数の、人間が読める説明 (ある場合)。 ない場合は空文字列。
- 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_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__()をスタックにプッシュします。 これは後でクラスを構築するために呼び出されます。
- 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を使おうとします。
- 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 = dwill be stored after execution asSTACK.extend((a, b, c)).
- STORE_ATTR(namei)¶
次の処理を実行します。
obj = STACK.pop() value = STACK.pop() obj.name = value
- DELETE_ATTR(namei)¶
次の処理を実行します。
obj = STACK.pop() del obj.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
nameiis set, this will attempt to load a method namedco_names[namei>>1]from theSTACK[-1]object.STACK[-1]is popped. This bytecode distinguishes two cases: ifSTACK[-1]has a method with the correct name, the bytecode pushes the unbound method andSTACK[-1].STACK[-1]will be used as the first argument (self) byCALLorCALL_KWwhen calling the unbound method. Otherwise,NULLand 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 thatnameiis shifted left by 2 bits instead of 1.The low bit of
nameisignals to attempt a method load, as withLOAD_ATTR, which results in pushingNULLand 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 ofopnameis set (opname & 16), the result should be coerced tobool.バージョン 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キーワード専用パラメーターのデフォルト値の辞書0x04a tuple of strings containing parameters' annotations0x08自由変数のセルを含み、クロージャを構成するタプル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ジェネレーター、コルーチン、非同期ジェネレーターのいずれでもない関数の開始位置1yield式の後2yield from式の後3await式の後
その次のビットは、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_ERRORExtracts the return value from a
StopIterationexception.INTRINSIC_ASYNC_GEN_WRAP非同期ジェネレーターの値をラップします
INTRINSIC_UNARY_POSITIVE単項
+演算を行いますINTRINSIC_LIST_TO_TUPLEリストをタプルに変換します
INTRINSIC_TYPEVARtyping.TypeVarを作成しますINTRINSIC_PARAMSPECtyping.ParamSpecを作成しますINTRINSIC_TYPEVARTUPLEtyping.TypeVarTupleを作成しますINTRINSIC_SUBSCRIPT_GENERIC引数を添字とした
typing.Genericを返しますINTRINSIC_TYPEALIAStyping.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_STARtry-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_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.hasjabs¶
絶対ジャンプ先を持つバイトコードのリスト。
バージョン 3.13 で非推奨: すべてのジャンプが相対ジャンプになりました。 このリストは空です。