CTF-web: 查看python代码抽象语法树
抽象语法树(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 + b
result = 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 ast
class 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 + b
def subtract(a, b):
return a - b
"""
# 解析代码为 AST
tree = ast.parse(code)
# 创建访问者并遍历 AST
lister = FunctionNameLister()
lister.visit(tree)
输出:
Function name: add
Function name: subtract