张芷铭的个人博客

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 → 代码需 astorcodegen
  • AST 结构随 Python 版本变化
  • 类型推断需结合类型注解或 mypy

Comments