関数/メソッドについて内省したいと思っています。私のすべての例では、Python 2.7 を使用していますが、3.3 を使用しても問題はありません。
foobar.py というモジュールに次のコードがあるとします。
def foo():
bar()
実行中の foo のコードを動的に確認できます。
import inspect
import foobar
inspect.getsource(foobar.foo)
この関数のコード オブジェクトから逆アセンブルされたバイトコードを取得することもできます。
import dis
dis.dis(foobar.foo)
foo
メソッドが別の関数 (bar
この場合) を呼び出していることを検出し、それを動的に逆アセンブル/検査する方法はありますか?
コード オブジェクト自体には、次のようなあらゆる種類の属性があることがわかっています。
>>> dir(foobar.foo.__code__)
['__class__', '__cmp__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']
私はそれらのほとんどを調べただけですが、探しているものがまったく見つかりませんでした.
最終的な目標は、インポート以外のコードを実行せずにコール スタックを再帰的に出力できるかどうかを確認するためのちょっとした実験です。理論上のコール スタックでは、特定の変数の状態などの実行時のことを説明できないことはわかっています。特定の呼び出しが与えられたすべてのネストされた関数のソースを出力したいと思います (コードがケースに基づいてケースを実行しない場合でも)。ランタイム状態)。
また、CPython コードに取り掛かると、inspect
およびモジュールが役に立たないこともわかっています。最終的には、どの CPython コードにいつ到達し、分解するdis
かを示すある種のマッピングを出力するのが楽しいかもしれません。ただし、それが可能かどうかさえわかりません。inspect
dis