disassembleっていう関数が面白かった
例えば
>>> add = lambda x,y:x+y
っていう関数を定義してdisってみると
>>> import dis >>> dis.dis(add) 1 0 LOAD_FAST 0 (x) 3 LOAD_FAST 1 (y) 6 BINARY_ADD 7 RETURN_VALUE
となっている。
バイトコード命令はfunc_code.co_codeで見ることが出来る
>>> add.func_code.co_code '|\x00\x00|\x01\x00\x17S'
これは整数値を文字にしたものをつなげた文字列として表現されているので、逆の操作をしてopcodeモジュールのopnameで対応を取ることができる
>>> from opcode import opname >>> code = add.func_code.co_code >>> for c in code: ... print opname[ord(c)] ... LOAD_FAST STOP_CODE STOP_CODE LOAD_FAST POP_TOP STOP_CODE BINARY_ADD RETURN_VALUE