我正在使用python ast (抽象语法树)。
我写了以下代码,它访问了AST的所有节点。
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类中添加了一些方法
def visit_Print(self, node):
print "Print :"
def visit_Assign(self, node):
print "Assign :"
def visit_Expr(self, node):
print "Expr :"但是,当它遇到"print“语句、赋值语句或表达式时,它似乎会停止,不再前进。
它输出:
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
发布于 2011-02-10 01:11:14
由于您的visit_Assign方法不显式处理Assign节点的子节点,因此语法树的遍历到此为止。
如果查看一下ast.py实现中的NodeVisitor.generic_visit方法,就会看到它遍历当前节点的子节点。因此,您可以显式地从需要处理子对象的每个方法中调用基类generic_visit方法:
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)发布于 2011-02-10 00:56:59
对于非终端节点,您的访问函数必须访问子节点。有关详细信息,请参阅Simple example of how to use ast.NodeVisitor?。
https://stackoverflow.com/questions/4947783
复制相似问题