関数.__ code__属性は、仮想マシンのバイトコードをカプセル化するオブジェクトを返します。
def f(): return 3
print(dir(f.__code__))
print(f.__code__.co_code) # raw compiled bytecode
情報にアクセスする別の方法は、明示的にファイルをコンパイルすることです。
def f(): return 3
その後、あなたはPythonのプロンプトに入力することができます:
>>> c = compile('test.py', 'test.py', 'exec')
>>> print(c.co_code) # here is some bytecode
バイトコードにアクセスするためのシンプルで面白い方法を、非常に読みやすい方法で、実行することです。ここ はファイルtest.py
です
python -m dis test.py
出力:
0それは、端末に(ここでは、
dis
は逆アセンブラです)
1 0 LOAD_CONST 0 (<code object f at 0x7fe8a5902300, file "p.py", line 1>)
3 LOAD_CONST 1 ('f')
6 MAKE_FUNCTION 0
9 STORE_NAME 0 (f)
12 LOAD_CONST 2 (None)
15 RETURN_VALUE
このバイトコードはプラットフォームに依存しません。 VMはです。バイトコードでの最終的な変化について
、私はthis fileを取り、それを2回分解しています:変更は主に輸入に関してれ
89c89
< 26 204 LOAD_CONST 13 (<code object search_concept at 0x7f40de337300, file "powergrasp/compression.py", line 26>)
---
> 26 204 LOAD_CONST 13 (<code object search_concept at 0x7fd8de5ab300, file "powergrasp/compression.py", line 26>)
104c104
< 240 LOAD_CONST 19 (<code object compress_lp_graph at 0x7f40de340780, file "powergrasp/compression.py", line 55>)
---
> 240 LOAD_CONST 19 (<code object compress_lp_graph at 0x7fd8de5b4780, file "powergrasp/compression.py", line 55>)
:
python3 -m dis file.py > test1
python3 -m dis file.py > test2
次に簡単なdiffがあることを示しここで、ロードされたモジュールのアドレスはコンパイル全体で同じではありません。
私はそれがインタプリタのバージョンによって変わるかもしれないと思う – wRAR