バイトコードの前の数値は、元のバイナリ バイトコードへのオフセットです。
>>> func.__code__.co_code
'd\x01\x00}\x00\x00d\x00\x00S'
一部のバイトコードには、各バイトコードの動作に影響を与える追加情報 (引数) が付属しています。オフセットは、バイトストリーム内のどの位置でバイトコードが見つかったかを示します。
LOAD_CONST
バイトコード (ASCII 、hex 64)のd
後には、バイトコードに関連付けられた定数への参照をエンコードする 2 つの追加バイトが続きます。その結果、STORE_FAST
オペコード (ASCII }
、hex 7D) はインデックス 3 で見つかります。
dis
モジュールのドキュメントには、各命令の意味が記載されています。についてLOAD_CONST
は、次のように述べています。
スタックにプッシュco_consts[consti]
します。
co_consts
コードオブジェクトに常に存在する構造を指します。コンパイラは次のように構成します。
>>> func.__code__.co_consts
(None, 1)
オペコードはその構造体からインデックス 1 をロードし (バイトコードの 01 00 バイトは 1 をエンコードします)、それdis
を検索しました。それは値1
です。
次の命令は、次のようにSTORE_FAST
記述されます。
TOS をローカルに格納しco_varnames[var_num]
ます。
ここで、 TOSはトップ オブ スタックを指します。値がスタックにプッシュLOAD_CONST
されたことに注意してください。別の構造です。ローカル変数名を参照し、オペコードはインデックス 0 を参照します。1
co_varnames
>>> func.__code__.co_varnames
('x',)
dis
それも調べました。コードで使用した名前は ですx
。したがって、このオペコードは に格納さ1
れx
ます。
もう 1 つはインデックス 0 からスタックにLOAD_CONST
ロードされ、その後に:None
RETURN_VALUE
関数の呼び出し元に TOS で戻ります。
そのため、この命令は (定数と共に) スタックの一番上を取り、None
このコード ブロックから戻ります。明示的なステートメントNone
のない関数のデフォルトの戻り値です。return
dis
出力、行番号から何かを省略しました:
>>> dis.dis(func)
2 0 LOAD_CONST 1 (1)
3 STORE_FAST 0 (x)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
2
最初の行に注意してください。これは、これらの手順に使用された Python コードを含む元のソースの行番号です。Python コード オブジェクトには、バイトコードを元のソースの行番号にマッピングできる属性がco_lnotab
あります。逆アセンブリを表示するときにこれを行います。co_firstlineno
dis