7

私はPythonASTを持っています[ast.parse()によって返される]。

私はこれがクラスメソッドのASTであることを知っています。

同じクラスの他のメソッドへのすべての呼び出しを見つけるにはどうすればよいですか?

基本的に、私は次のようなものを収集したいと思います。

['foo', 'bar']

次のようなコードスニペットの場合:

def baz(self): # this is a class method
    '''baz docstring'''
    self.foo() + self.bar()

ASTを受け入れ、同じクラスのメソッド内で呼び出されているクラスの他のメソッド[文字列としてのメソッド名]のリストを返す関数が必要です。

4

1 に答える 1

18

一般的なアプローチは、サブクラス化することast.NodeVisitorです。

>>> class VisitCalls(ast.NodeVisitor):
...   def visit_Call(self, what):
...     if what.func.value.id == 'self':
...       print what.func.attr
... 
>>> f='''def x(self):
...   return self.bar() + self.baz()
... '''
>>> xx = ast.parse(f)
>>> VisitCalls().visit(xx)
bar
baz

ただし、これはへの「即時」呼び出しのみをキャッチしself.somethingます。一般的なケースでは、たとえばsomelist.append(self.blah)、コードのかなり後の方でsomelist[i + j]()、後者がself.blah現在のインスタンスのメソッドとは関係のない他の呼び出し可能オブジェクトの呼び出しであるかどうかを判断する問題は、チューリング完全(CS専門用語)です。数学者が「NP困難」と言うのと同じように、「一般的な場合は完全に不溶性」の場合;-)。

しかし、必要なのが単純な「即時呼び出し」の場合を解決することだけである場合は、問題ありません;-)。

于 2010-03-04T15:58:08.990 に答える