Python 的 ast 模块将源代码解析为抽象语法树,支持静态分析、自动化重构和元编程。
核心功能
| 功能 | 函数/类 | 说明 |
|---|
| 解析代码 | ast.parse(source) | 将字符串源码解析为 AST 根节点 |
| 安全求值 | ast.literal_eval(s) | 安全解析字面量表达式 |
| AST 可视化 | ast.dump(node, indent) | 将 AST 节点转为可读字符串 |
| 遍历节点 | ast.NodeVisitor | 重写 visit_NodeType() 遍历特定节点 |
| 修改节点 | ast.NodeTransformer | 返回新节点替换原节点 |
基础使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| import ast
# 解析代码为 AST
code = """
def add(a, b):
return a + b
"""
tree = ast.parse(code)
# 遍历 AST(提取函数名)
class FunctionVisitor(ast.NodeVisitor):
def visit_FunctionDef(self, node):
print(f"Found function: {node.name}")
self.generic_visit(node)
visitor = FunctionVisitor()
visitor.visit(tree)
|
修改 AST
1
2
3
4
5
6
7
8
9
10
11
12
| # 将函数名 add → multiply
class RenameTransformer(ast.NodeTransformer):
def visit_FunctionDef(self, node):
node.name = "multiply"
return node
transformer = RenameTransformer()
new_tree = transformer.visit(tree)
# 转换 AST 回代码(需 astor 库)
import astor
new_code = astor.to_source(new_tree)
|
应用场景
| 场景 | 说明 |
|---|
| 静态代码分析 | 检查未使用变量、命名规范 |
| 自动化重构 | 替换 API 调用、语法升级 |
| 元编程 | 动态生成函数/类 |
| 性能优化 | 提取循环常量、内联展开 |
literal_eval:安全解析
ast.literal_eval(s) 安全解析字符串为 Python 字面量对象:
1
2
| import ast
result = ast.literal_eval("[1, 2, 3]") # 输出 [1, 2, 3]
|
literal_eval vs eval
| 特性 | literal_eval() | eval() |
|---|
| 执行范围 | 仅解析数据结构 | 执行任意代码 |
| 安全风险 | 无风险 | 高危(代码注入) |
| 适用场景 | 外部数据 | 可信数据 |
支持类型:整数、浮点数、字符串、布尔值、列表、字典、元组、集合。
不支持:数学运算、函数调用、变量赋值。
注意事项
- 避免直接
exec(ast):确保来源可信 - AST → 代码需
astor 或 codegen 库 - AST 结构随 Python 版本变化
- 类型推断需结合类型注解或
mypy
Comments