首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python AST处理

Python AST处理
EN

Stack Overflow用户
提问于 2010-03-04 20:52:52
回答 1查看 3.3K关注 0票数 7

我有一个由ast.parse()返回的Python AST。

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

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

基本上,我想收集一些东西,比如:

代码语言:javascript
复制
['foo', 'bar']

对于像这样的代码片段:

代码语言:javascript
复制
def baz(self): # this is a class method
    '''baz docstring'''
    self.foo() + self.bar()

我需要一个函数,它将接受AST并将其他方法的方法名列表作为类的字符串返回,这些字符串在同一个类的方法中被调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-04 23:58:09

一般的方法是继承ast.NodeVisitor的子类

代码语言:javascript
复制
>>> 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";-)。

但是,如果您所需要的只是解决简单的“立即呼叫”情况,那么您就可以继续了;-)。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2379355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档