我有一个 Python AST [由 ast.parse() 返回]。
我知道这是类方法的 AST。
如何找到对同一类的其他方法的所有调用?
基本上,我想收集这样的东西:
['foo', 'bar']
对于像这样的代码片段:
def baz(self): # this is a class method
'''baz docstring'''
self.foo() + self.bar()
我需要一个函数,它将接受 AST 并将返回在同一类的方法内部调用的类的其他方法列表 [方法名称作为字符串]。
最佳答案
一般的做法是子类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]()
中:判断后者是否调用 的问题code>self.blah
或与当前实例的方法无关的其他一些可调用对象是图灵完备的(CS 术语“在一般情况下完全不可溶”,就像数学家可能会说“NP -硬";-).
但如果您只需要解决简单的“立即调用”案例,您就可以开始了;-)。
关于Python AST 处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2379355/