NodeVisitor traverse la profondeur AST en premier et ne visite chaque nœud qu'une seule fois, lors de la saisie. Il est donc problématique de faire quelque chose de sérieux avec cela. Est-il possible de changer son comportement par défaut?Est-il possible de visiter des nœuds en AST Python avec ast.NodeVisitor deux fois ou changer l'ordre de traversée?
1
A
Répondre
1
Non. Vous devriez écrire votre propre visiteur. La visite récursive de tous les nœuds est assez simple, donc si le module ast ne le fait pas pour vous (et il n'y a rien dans le module pour faire ce que vous voulez, dans ce cas), ce n'est pas si mal de le faire vous même .
6
Peut-être que quelqu'un sera intéressé par certains esquissée par exemple, comment faire ce qui a été proposé par DSblizzard, donc entendre est mon exemple:
import ast
class RecursiveVisitor(ast.NodeVisitor):
""" example recursive visitor """
def recursive(func):
""" decorator to make visitor work recursive """
def wrapper(self,node):
func(self,node)
for child in ast.iter_child_nodes(node):
self.visit(child)
return wrapper
@recursive
def visit_Assign(self,node):
""" visit a Assign node and visits it recursively"""
print(type(node).__name__)
@recursive
def visit_BinOp(self, node):
""" visit a BinOp node and visits it recursively"""
print(type(node).__name__)
@recursive
def visit_Call(self,node):
""" visit a Call node and visits it recursively"""
print(type(node).__name__)
@recursive
def visit_Lambda(self,node):
""" visit a Function node """
print(type(node).__name__)
@recursive
def visit_FunctionDef(self,node):
""" visit a Function node and visits it recursively"""
print(type(node).__name__)
@recursive
def visit_Module(self,node):
""" visit a Module node and the visits recursively"""
pass
def generic_visit(self,node):
pass
class SimpleVisitor(ast.NodeVisitor):
""" simple visitor for comparison """
def recursive(func):
""" decorator to make visitor work recursive """
def wrapper(self,node):
func(self,node)
for child in ast.iter_child_nodes(node):
self.visit(child)
return wrapper
def visit_Assign(self,node):
""" visit a Assign node """
print(type(node).__name__)
def visit_BinOp(self, node):
""" visit a BinOp node """
print(type(node).__name__)
def visit_Call(self,node):
""" visit a Call node """
print(type(node).__name__)
def visit_Lambda(self,node):
""" visit a Function node """
print(type(node).__name__)
def visit_FunctionDef(self,node):
""" visit a Function node """
print(type(node).__name__)
@recursive
def visit_Module(self,node):
""" visit a Module node and the visits recursively, otherwise you
wouldn't see anything here"""
pass
def generic_visit(self,node):
pass
# usage example
a = """
b= lambda x: x*5 +5
def hhh(u):
b=19
return u*b
m=hhh(9*4+5)
"""
recursive_visitor = RecursiveVisitor()
simple_visitor = SimpleVisitor()
tree = ast.parse(a)
print('\nvisit recursive\n')
recursive_visitor.visit(tree)
print('\nvisit simple\n')
simple_visitor.visit(tree)
quelqu'un Hope peut trouver utile.
Questions connexes
- 1. Python AST - fusion de deux AST
- 2. Visite de nœuds dans un arbre de syntaxe avec Python ast module
- 3. Irony: Didacticiel sur l'évaluation des nœuds AST?
- 4. manipulation AST en Python
- 5. Modules de traversée de hiérarchie et de comparaison pour Python?
- 6. TypeError: ne peut pas visiter Arel :: Les nœuds de l'Union
- 7. Rejoindre deux tables deux fois dans MySQL. Possible ou pas ???
- 8. Différentes façons d'analyser/de visiter des expressions lors de la traversée
- 9. Conversion de traversée de graphe en multitraitement en Python
- 10. Visiter le cadre une fois?
- 11. Puis-je visiter une page Web plusieurs fois avec une nouvelle adresse IP à chaque fois en utilisant Python?
- 12. Traitement AST Python
- 13. Java ASM Visiter une méthode plusieurs fois
- 14. Python, Avec ... comme ... Accès AST/Symbol
- 15. JLabel wont changer de couleur deux fois
- 16. Pyramide Python - Problème d'acheminement d'URL et de traversée avec shash (/)
- 17. python: invocation de socket.recvfrom() deux fois
- 18. Changer plusieurs éléments à la fois en Python
- 19. Soumettre le formulaire deux fois ou rafraîchir deux fois
- 20. Traversée de postorder en utilisant la récursivité en Python
- 21. Exécution de IPython VISITER
- 22. Traversée de l'arbre d'aide Ocaml
- 23. Comment transformer une fonction Python non datée/lambda en AST? 2.6
- 24. Traversée de l'arborescence des parenthèses avec des parenthèses
- 25. Traversée d'arbres avec corecursion
- 26. Tree Traversal pour échanger deux nœuds
- 27. Générique N-ary Tree (Arborescence avec plus de deux nœuds par enfant) Traversée d'arbres dans Java en utilisant List pour les nœuds
- 28. messages de journal apparaissant deux fois avec Python Logging
- 29. Suivi de la position de la source des nœuds AST dans un compilateur (ocaml)
- 30. Changer de répertoire avec os.walk en python