我有一个Python AST [由ast.parse()返回。)
我知道这是一个类方法的AST。
如何查找对同一类别的其他方法的所有调用?
基本上,我想收集类似的内容:
['foo', 'bar']
代码片段如下:
def baz(self): # this is a class method
'''baz docstring'''
self.foo() + self.bar()
我需要一个接受AST的函数,并返回在同一个类的方法中调用的类的其他方法[方法名称作为字符串]的列表。
答案 0 :(得分: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
但是,这只会抓住self.something
的“即时”电话。在一般情况下,你可以有例如somelist.append(self.blah)
然后在代码somelist[i + j]()
中稍后:确定后者是对self.blah
的调用还是与当前实例的方法无关的其他可调用的问题图灵完全(CS术语“完全不溶于一般情况”,就像数学家可能会说“NP-hard”; - )。
但如果您只需要解决简单的“即时通话”案例,那么您就可以了; - )。