2017-10-03 3 views
0

私はPython関数のコールグラフを作成し、いくつかの関数のバイトコードを変更する必要があります。バイトコードからファンクションコードオブジェクトを取得するには?

私は解体してプレイし始めて、その機能を発見したがMAKE_FUNCTIONオペコードと何とかそれに

32   96 LOAD_CONST    25 ((None, None, True, 'off', None, False)) 
      98 LOAD_CONST    15 (<code object foobar at 0x7fc46bff6d20, file "foo.py", line 25>) 
      100 LOAD_CONST    16 ('foo') 
      102 MAKE_FUNCTION   1 
      104 STORE_NAME    15 ('fun') 

オーケーを渡されたコードオブジェクトによって作成され、私は、このファイルにコールグラフの根を見つけましたが、何をすべきか次?実際にこのコードオブジェクトを取得するにはどうすればよいですか?

答えて

0

あなたが望むのは機能の種類です。 typesモジュール(types.FunctionTypeの場合)またはtype(lambda:0)のモジュールから入手できます。型にhelp()を実行して、関数オブジェクトの作成に必要な引数を確認します。

関数を構築するために必要なのは、コードオブジェクトです。あなたはf.func_codeを使って、既存の関数fからそれを得ることができます。バイトコードを変更する場合は、それを含む新しいコードオブジェクトを作成する必要があります。そのタイプは関数と同様にtype()を使用して取得することができ、タイプにhelp()を入力すると、渡す必要があることが伝えられます。

既存のものに新しい関数を適用する場合は、既存の機能から必要なもの。関数とコードオブジェクトのどの属性に興味のあるものが含まれているかは、inspectモジュールドキュメントのthis tableを参照してください。

+0

ええと...私の質問にどう答えるかわかりません。私はpycファイルを持っています、私は 'dis.dis'でそれを逆アセンブルしました。じゃあ何? – user1685095

+0

あなたはその機能を持っているか、 'dis'で逆アセンブルすることはできませんでした。したがって、関数 'f'のコードオブジェクトは' f.func_code'で、バイトコード文字列は 'f.func_code.co_code'です。バイトコードを変更したい場合は、コードと関数の種類を使用して新しい関数を作成する必要があります。 – kindall

+0

ソースファイルがなく、コンパイルされたファイルのみを持っているとどうなりますか? – user1685095

関連する問題