ast
Pythonのモジュールを調べましたか。それはあなたが探しているものを正確に実行するわけではありませんが、おそらくそれを使用してより簡単にあなた自身を構築することができます。
編集コメントの質問に答えるには:
以下を保存するとtest.py
def add(a, b):
return a + b
def mult(a, b):
result = 0
for i in range(b):
result += add(result, a)
return result
その後、
import _ast
test = compile(open('test.py').read(), 'test.py', 'exec', _ast.PyCF_ONLY_AST)
次に、Moduleクラスであり、body属性を持つテストがあります。このbody属性はモジュール内のすべてのリストであるため、この例では次のようになります。
test.body # >>> [<_ast.FunctionDef object at 0x...>, <_ast.FunctionDef object at 0x...>]
test.body[0].name # >>> 'add'
(test.body[0].lineno, test.body[0].col_offset) # >>> 1, 0
test.body[0].body # >>> [<_ast.Return object at 0x...>]
test.body[1].body # >>> [<_ast.Assign ...>, <_ast.For ...>, <_ast.Return ...>]
# etc.
追跡するクラスを見つけて、各ステートメントに異なるクラスが関連付けられていることに注意してください。
おそらく最初に思ったほど簡単ではないでしょうが、恐ろしいことではないはずです。ast
また、それを繰り返し行うには、次のような機能を持つモジュールが必要になりますiter_child_nodes
。
test2 = next(ast.iter_child_nodes(test))
test2 is test.body[0]