如何获取有保证的Python AST广度优先遍历方法?
Python AST 广度优先遍历的可靠实现
Python标准库中的ast.walk确实不保证遍历顺序,文档明确说明其输出顺序是未指定的,仅作为实现细节。如果需要严格保证广度优先(BFS)的遍历顺序,你可以手动基于队列实现一个遍历函数,逻辑清晰且可控:
import ast from collections import deque def ast_bfs(root): queue = deque([root]) while queue: node = queue.popleft() yield node # 遍历当前节点的所有子节点,加入队列 for field, value in ast.iter_fields(node): if isinstance(value, ast.AST): queue.append(value) elif isinstance(value, list): for item in value: if isinstance(item, ast.AST): queue.append(item)
函数说明
这个函数通过双端队列维护待处理的节点:
- 初始时将根节点加入队列
- 每次取出队首节点并返回(当前层级的节点)
- 遍历当前节点的所有字段,将其中的AST节点(包括列表中的AST节点)依次加入队尾(下一层级的节点)
这样就能严格保证遍历顺序是广度优先——先处理完当前层级的所有节点,再进入下一层级。
使用示例
你可以像使用ast.walk一样调用这个函数:
# 解析一段示例代码 tree = ast.parse("x = 1 + 2") # 广度优先遍历所有节点 for node in ast_bfs(tree): print(type(node).__name__)
输出顺序会是:Module → Assign → Name → BinOp → Constant → Constant,完全符合广度优先的层级顺序。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

