抽象语法树(Abstract Syntax Tree,简称 AST)是源代码的树状表示,展示了代码的语法结构。在 Python 中,
ast
模块可以帮助你解析和操作 Python 代码的 AST。
1. 使用 ast
模块解析 Python 代码
我们可以使用 ast.parse
将一段 Python 代码解析为 AST,然后使用 ast.dump
查看其结构。
import ast# 示例代码
code = """
def add(a, b):return a + bresult = add(5, 3)
print(result)
"""# 解析代码为 AST
tree = ast.parse(code)# 打印 AST 的结构
print(ast.dump(tree, indent=4))
输出示例:
Module(body=[FunctionDef(name='add',args=arguments(posonlyargs=[],args=[arg(arg='a'),arg(arg='b')],kwonlyargs=[],kw_defaults=[],defaults=[]),body=[Return(value=BinOp(left=Name(id='a', ctx=Load()),op=Add(),right=Name(id='b', ctx=Load())))],decorator_list=[],type_params=[]),Assign(targets=[Name(id='result', ctx=Store())],value=Call(func=Name(id='add', ctx=Load()),args=[Constant(value=5),Constant(value=3)],keywords=[])),Expr(value=Call(func=Name(id='print', ctx=Load()),args=[Name(id='result', ctx=Load())],keywords=[]))],type_ignores=[])
2. 遍历 AST
你可以编写一个访问者(Visitor),遍历 AST 的各个节点,并对特定类型的节点进行处理。例如,下面的代码将遍历 AST 并打印出所有函数定义的名称:
import astclass FunctionNameLister(ast.NodeVisitor):def visit_FunctionDef(self, node):print(f"Function name: {node.name}")# 继续遍历函数内部的节点self.generic_visit(node)# 示例代码
code = """
def add(a, b):return a + bdef subtract(a, b):return a - b
"""# 解析代码为 AST
tree = ast.parse(code)# 创建访问者并遍历 AST
lister = FunctionNameLister()
lister.visit(tree)
输出:
Function name: add
Function name: subtract