0

astPythonでクラスを操作しようとしています。すべての関数呼び出しとそれに対応する引数を取得したい。

どうすればそれを実装できますか? python.org の公式ドキュメントは非常に曖昧です。

visit_Name私もandを実装しようとvisit_Callしましたが、それは Call の名前以上のものを与えてくれます。どのノードがどの属性を持っているかについてのドキュメントがあればいいのですが。たとえば、Name-node の場合は id、Call-node の場合は func です。

4

1 に答える 1

2

私は他のドキュメントを知りませんが、Alex Martelli によるthis oneなどの例を研究することで多くのことを学ぶことができます。次のように、わずかに変更することから始めることができます。

import ast

class FuncVisit(ast.NodeVisitor):
    def __init__(self):
        self.calls = []
        self.names = []
    def generic_visit(self, node):
        # Uncomment this to see the names of visited nodes
        # print(type(node).__name__)
        ast.NodeVisitor.generic_visit(self, node)
    def visit_Name(self, node):
        self.names.append(node.id)
    def visit_Call(self, node):
        self.names = []
        ast.NodeVisitor.generic_visit(self, node)
        self.calls.append(self.names)
        self.names = []        
    def visit_keyword(self, node):
        self.names.append(node.arg)

tree = ast.parse('''\
x = foo(a, b)
x += 1
bar(c=2)''')
v = FuncVisit()
v.visit(tree)
print(v.calls)

収量

[['foo', 'a', 'b'], ['bar', 'c']]
于 2013-05-03T15:09:32.190 に答える