Python AST 处理

标签 python abstract-syntax-tree

我有一个 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/

相关文章:

javascript - 如何让 @babel/parser 将 'undefined' 识别为特殊标记?

python - django "in"子句是否要求列表有两个值?

java - 处理成eclipse对java代码的解析?

c++ - 使用 Clang 查找 If 条件

python - Jython 日志记录时间错误

compiler-construction - OCaml 中 S 表达式树到抽象语法树

java - Eclipse 中的 ASTVisitor

python - 按所需顺序对大文件进行排序

python - 以串行对象为参数的多进程

python - fnmatch 只返回列表中的第一个文件名