首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python ast模块访问语法树中的节点

使用Python ast模块访问语法树中的节点
EN

Stack Overflow用户
提问于 2011-02-10 00:38:48
回答 2查看 10.9K关注 0票数 9

我正在使用python ast (抽象语法树)。

我写了以下代码,它访问了AST的所有节点。

代码语言:javascript
复制
import ast

class Py2Neko(ast.NodeVisitor):
    def generic_visit(self, node):
              print type(node).__name__
              ast.NodeVisitor.generic_visit(self, node)

       def visit_Name(self, node):
              print 'Name :', node.id

       def visit_Num(self, node):
              print 'Num :', node.__dict__['n']

       def visit_Str(self, node):
              print "Str :", node.s

if __name__ == '__main__':

    node = ast.parse("a = 1 + 2")

    print ast.dump(node)

    v = Py2Neko()
    v.visit(node)

然后在Py2Neko类中添加了一些方法

代码语言:javascript
复制
def visit_Print(self, node):
    print "Print :"

def visit_Assign(self, node):
    print "Assign :"

def visit_Expr(self, node):
    print "Expr :"

但是,当它遇到"print“语句、赋值语句或表达式时,它似乎会停止,不再前进。

它输出:

代码语言:javascript
复制
Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=BinOp(left=Num(n=1), op=Add(),       right=Num(n=2)))])
Module
Assign :

谁能告诉我我做错了什么。

我使用的是Python 2.6.6

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-10 01:11:14

由于您的visit_Assign方法不显式处理Assign节点的子节点,因此语法树的遍历到此为止。

如果查看一下ast.py实现中的NodeVisitor.generic_visit方法,就会看到它遍历当前节点的子节点。因此,您可以显式地从需要处理子对象的每个方法中调用基类generic_visit方法:

代码语言:javascript
复制
import ast

class Py2Neko(ast.NodeVisitor):
    def generic_visit(self, node):
        print type(node).__name__
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Name(self, node):
        print 'Name :', node.id

    def visit_Num(self, node):
        print 'Num :', node.__dict__['n']

    def visit_Str(self, node):
        print "Str :", node.s

    def visit_Print(self, node):
        print "Print :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Assign(self, node):
        print "Assign :"
        ast.NodeVisitor.generic_visit(self, node)

    def visit_Expr(self, node):
        print "Expr :"
        ast.NodeVisitor.generic_visit(self, node)

if __name__ == '__main__':
    node = ast.parse("a = 1 + 2")

    print ast.dump(node)

    v = Py2Neko()
    v.visit(node)
票数 11
EN

Stack Overflow用户

发布于 2011-02-10 00:56:59

对于非终端节点,您的访问函数必须访问子节点。有关详细信息,请参阅Simple example of how to use ast.NodeVisitor?

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

https://stackoverflow.com/questions/4947783

复制
相关文章

相似问题

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