誰も、Python 2.6で抽象構文木を歩くためにast.NodeVisitorを使用する単純な例はありますか? visitとgeneric_visitの違いはわかりません。google codesearchやplain googleを使用した例は見つかりません。ast.NodeVisitorの使い方の簡単な例?
答えて
ast.visit
- あなたはもちろん、サブクラスでそれを上書きしない限り - そのメソッドが存在する場合は、クラスfoo
のast.Node
を訪問すると呼ばれ、そうでない場合self.generic_visit
、self.visit_foo
を呼び出します。後者は、クラスast
自体の実装では、すべての子ノードでself.visit
を呼び出すだけです(他のアクションは実行しません)。
ので、例えば、考える:すべての子供たちも訪問されるように、ここで
>>> class v(ast.NodeVisitor):
... def generic_visit(self, node):
... print type(node).__name__
... ast.NodeVisitor.generic_visit(self, node)
...
、我々は(基底クラスに呼び出しgeneric_visit
をオーバーライドしているクラス名を印刷するには、だけでなく、 )。だから、例えば...:
>>> x = v()
>>> t = ast.parse('d[x] += v[y, x]')
>>> x.visit(t)
が発する:
Module
AugAssign
Subscript
Name
Load
Index
Name
Load
Store
Add
Subscript
Name
Load
Index
Tuple
Name
Load
Name
Load
Load
Load
しかし、我々はロード・ノード(とその子供たちのために気にしませんでしたと仮定 - 彼らはいずれかを持っていた場合に;-)。そして、簡単なことに対処するための方法かもしれません、例えば:
>>> class w(v):
... def visit_Load(self, node): pass
...
今、私たちはロードノードを訪問している、visit
派遣、任意のより多くのgeneric_visit
しないが、「doesnの新visit_Load
...へ何もしません。したがって:
>>> y = w()
>>> y.visit(t)
Module
AugAssign
Subscript
Name
Index
Name
Store
Add
Subscript
Name
Index
Tuple
Name
Name
また、名前ノードの実際の名前も見たいとします。 then:...
>>> class z(v):
... def visit_Name(self, node): print 'Name:', node.id
...
>>> z().visit(t)
Module
AugAssign
Subscript
Name: d
Index
Name: x
Store
Add
Subscript
Name: v
Index
Tuple
Name: y
Name: x
Load
Load
しかし、NodeVisitorは訪問時に情報を格納できるため、クラスです。私たちが望むのは、「モジュール」内の名前のセットだとします。その後、我々はこれ以上generic_visit
をオーバーライドする必要はなく、むしろ...しません:
>>> class allnames(ast.NodeVisitor):
... def visit_Module(self, node):
... self.names = set()
... self.generic_visit(node)
... print sorted(self.names)
... def visit_Name(self, node):
... self.names.add(node.id)
...
>>> allnames().visit(t)
['d', 'v', 'x', 'y']
この種のことはgeneric_visit
のオーバーライドを必要とするものより一般的なユースケースである - 通常は、あなただけの興味を持っていますモジュールと名前のようないくつかの種類のノードでは、visit_Module
とvisit_Name
をオーバーライドし、私たちの代わりにastのvisit
をディスパッチさせます。
generic_visit
カスタムビジター(visit_Name)が見つからない場合に呼び出されます。最近、ast.NodeVisitor:https://github.com/pypy/pypy/blob/master/py/_code/_assertionnew.pyでASTノードをデバッグするように解釈し、特別な実装が提供されていない場合は、generic_visit
に戻ります。
ast.pyのコードを見ると、ペーストをコピーして自分の歩行器を動かすのは難しくありません。例えば。
import ast
def str_node(node):
if isinstance(node, ast.AST):
fields = [(name, str_node(val)) for name, val in ast.iter_fields(node) if name not in ('left', 'right')]
rv = '%s(%s' % (node.__class__.__name__, ', '.join('%s=%s' % field for field in fields))
return rv + ')'
else:
return repr(node)
def ast_visit(node, level=0):
print(' ' * level + str_node(node))
for field, value in ast.iter_fields(node):
if isinstance(value, list):
for item in value:
if isinstance(item, ast.AST):
ast_visit(item, level=level+1)
elif isinstance(value, ast.AST):
ast_visit(value, level=level+1)
ast_visit(ast.parse('a + b'))
プリントアウト
Module(body=[<_ast.Expr object at 0x02808510>])
Expr(value=BinOp(op=Add()))
BinOp(op=Add())
Name(id='a', ctx=Load())
Load()
Add()
Name(id='b', ctx=Load())
Load()
- 1. google-people apiの簡単な使用例
- 2. 簡単な例SwingUtilities
- 3. RestTemplate簡単な例
- 4. MKAnnotation、簡単な例
- 5. pthread_joinデッドロックの簡単な例
- 6. Qt:Quazipの簡単な例
- 7. 簡単なJavaジェネリックスの例
- 8. DispatcherHelperの簡単な例
- 9. 簡単な例の問題
- 10. GTKmmコンパイルエラーの簡単な例
- 11. biopythonクラスタリングの簡単な例
- 12. Guava ValueGraphの簡単な例
- 13. mpld3の簡単な例
- 14. C++クラスメンバコールバックの簡単な例
- 15. 簡単なPaypal IPNの例?
- 16. ActionForward Strutsの簡単な使い方1.3
- 17. Symfony2を使った簡単な例
- 18. WPF - シーケンシャルアニメーション簡単な例
- 19. Async/Await、簡単な例(typescript)
- 20. HERESに簡単な例リスト
- 21. 簡単な印刷例
- 22. C++キュー - 簡単な例
- 23. アパッチのIgnite - 簡単なPythonの例
- 24. Cターゲットランタイムの簡単なANTLR 3.4の例
- 25. AkkaのRoudnRobinGroupの簡単な例
- 26. JSONDATA:アンドロイドの簡単なjsondataの例
- 27. RabbitMQのメッセージングの簡単な例
- 28. RDFでのReificationの簡単な例
- 29. TwitterのAPIリクエストの簡単な例
- 30. levelplot - それを使用する方法、簡単な例?
ありがとうございます!これはまさに私が探していたものです。 – lacker
@lacker、よろしいですか? –
素晴らしいですが、私は今、compiler.astとastの違いをもっと理解したいと思います... –