2011-02-09 84 views
9

私は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

答えて

10

あなたのvisit_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) 
+0

大丈夫、あなたが説明したことを得ました、今はっきりしています、ありがとう! – narke

4

を使用してい

、あなたの訪問の機能は、子供たちを訪問しています。詳細については、Simple example of how to use ast.NodeVisitor?を参照してください。

+0

D'ああ - 私はこれを考えて何とか(不合理)と仮定したが 'NodeVisitor'は、これを処理するだろうそのままで。 – delnan

+0

私はあなたが提供する例を見ましたが、子供たちを訪問する方法を指定しましたか?たとえば、http://dev.pocoo.org/hg/sandbox/file/98ce1ce17c7c/ast/codegen.pyにはvisit_Print()などがあり、それはうまくいくようですが、私のためではありません。 – narke

関連する問題