Python AST处理

Ale*_*der 7 python abstract-syntax-tree

我有一个Python AST [由ast.parse()返回].

我知道这是一个类方法的AST.

如何查找对同一类的其他方法的所有调用?

基本上,我想收集类似的东西:

['foo', 'bar']
Run Code Online (Sandbox Code Playgroud)

对于代码片段,例如:

def baz(self): # this is a class method
    '''baz docstring'''
    self.foo() + self.bar()
Run Code Online (Sandbox Code Playgroud)

我需要一个接受AST的函数,并返回在同一个类的方法中调用的类的其他方法[方法名称作为字符串]的列表.

Ale*_*lli 17

一般方法是子类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
Run Code Online (Sandbox Code Playgroud)

但是,这只会捕获"立即"的电话self.something.在一般情况下,您可以somelist.append(self.blah)在代码中使用eg ,然后更晚somelist[i + j]():确定后者是否是self.blah对当前实例的方法无关的其他可调用的调用的问题是Turing-complete(CS术语)因为"完全不能解决一般情况",就像数学家可能会说"NP-hard";-).

但如果您只需要解决简单的"即时通话"案例,那么您就可以去了;-).