7

我有一个 Python AST [由 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-hard”;-)。

但是,如果您只需要解决简单的“立即呼叫”案例,那么您就可以开始了;-)。

于 2010-03-04T15:58:08.990 回答