- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
NodeVisitor 以深度优先的方式遍历 AST,并且在进入时仅访问每个节点一次。因此,用它做一些严肃的事情是有问题的。是否可以更改其默认行为?
最佳答案
也许有人会对一些草拟的例子感兴趣,如何做 DSblizzard 提出的建议,所以听听我的例子:
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)
希望有人会发现它有用。
关于python - 是否可以使用 ast.NodeVisitor 访问 Python AST 中的节点两次或更改遍历顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533662/
有没有人有一个使用 ast.NodeVisitor 在 Python 2.6 中遍历抽象语法树的简单示例?我不清楚 visit 和 generic_visit 之间的区别,我找不到任何使用 googl
我几乎是编程的初学者,目前正在尝试使用 JSoup 构建我的第一个网络抓取工具。到目前为止,我能够从我的目标网站的单个页面获取我想要的数据,但我自然希望以某种方式遍历整个网站。 JSoup 似乎为此提
是否可以仅通过操作 ast.NodeVisitor.generic_visit() 对 Python 中的 ast.NodeVisitor 实例进行后序遍历?我这样做了: class ExpParse
在不得不切换到 Firebase Admin 4.0.0 SDK 之后,我在服务器上得到了这个。任何人都知道我可以切换回旧的 server-sdk 依赖项的任何方式,或者解决此异常的方法?同时我已经向
想象一下以下类型的字符串: if ((a1 and b) or (a2 and c)) or (c and d) or (e and f) 现在,我想得到括号中的表达式,所以我用以下语法编写了一个 P
NodeVisitor 以深度优先的方式遍历 AST,并且在进入时仅访问每个节点一次。因此,用它做一些严肃的事情是有问题的。是否可以更改其默认行为? 最佳答案 也许有人会对一些草拟的例子感兴趣,如何做
我是一名优秀的程序员,十分优秀!