2016-04-14 4 views
1

が、私はast.NodeTransformerを使用してASTを横断してNoneで、すべての空のリストを置き換え、簡単なスクリプトを書きました:どのようにしてAST訪問者を中止し、元のノードを変更しないままにすることができますか? <code>ast</code>と<code>astor</code>ライブラリを使用して

import ast 
import astor 


class ListChanger(ast.NodeTransformer): 
    def visit_List(self, node): 
     if len(node.elts) > 0: 
      return ast.copy_location(node, node) 
     return ast.copy_location(ast.NameConstant(value=None), node) 

x = ast.parse("""["A"]""") 
ListChanger().visit(x) 
print(astor.to_source(x)) 

y = ast.parse("""[]""") 
ListChanger().visit(y) 
print(astor.to_source(y)) 

をこれは正しく動作し、出力:

["A"] 
None 

しかし、リストが空であれば、私が関数から抜け出そうとしていた行は不明です。

return ast.copy_location(node, none) 

returnと置き換えて、条件が満たされない場合にスクリプトをNoneに戻すと、ノードは変更されずに破棄され、ast.Listノードが破棄されたため、最初のテストケースが空文字列に印刷されます。

私はこれが起こりたくないと思っていますが、私はast.copy_location(node, node)を使っても間違っていると思います。ノードが変更されずに関数を終了する、またはvisit関数がNoneを返す場合、ノードは変更されないように、ast.NodeTransformerを設定する専用の関数はありますか? documentationから

答えて

1

戻り値には、交換が行われなかった場合に元のノードであってもよいです。ただ

return ast.copy_location(node, none) 

ので、代わりの

ブリリアント
return node 
+0

- ドキュメントで見て考えていませんでした。ありがとうございました! –

関連する問題