我正在玩python ast(抽象語法樹)。使用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 :"
但是當它遇到一個「打印」語句或assignement或表達它似乎停止,並沒有進一步的打算。
它輸出:
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
D'哦 - 我想這一點,但不知何故(不合理)假設`NodeVisitor`處理這個在其自己的。 – delnan 2011-02-09 17:02:30
我看到你提供的例子,但如何指定訪問孩子?例如這裏:http://dev.pocoo.org/hg/sandbox/file/98ce1ce17c7c/ast/codegen.py他們有visit_Print()和其他人,它似乎工作,但不適合我。 – narke 2011-02-09 17:15:45