CTF-web: 查察python代码抽象语法树

[复制链接]
发表于 2025-10-24 02:55:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
抽象语法树(Abstract Syntax Tree,简称 AST)是源代码的树状表现,展示了代码的语法结构。在 Python 中,ast 模块可以资助你剖析和操纵 Python 代码的 AST。
1. 使用 ast 模块剖析 Python 代码

我们可以使用 ast.parse 将一段 Python 代码剖析为 AST,然后使用 ast.dump 查察其结构。
  1. import ast
  2. # 示例代码
  3. code = """
  4. def add(a, b):
  5.     return a + b
  6. result = add(5, 3)
  7. print(result)
  8. """
  9. # 解析代码为 AST
  10. tree = ast.parse(code)
  11. # 打印 AST 的结构
  12. print(ast.dump(tree, indent=4))
复制代码
输出示例:
  1. Module(
  2.     body=[
  3.         FunctionDef(
  4.             name='add',
  5.             args=arguments(
  6.                 posonlyargs=[],
  7.                 args=[
  8.                     arg(arg='a'),
  9.                     arg(arg='b')],
  10.                 kwonlyargs=[],
  11.                 kw_defaults=[],
  12.                 defaults=[]),
  13.             body=[
  14.                 Return(
  15.                     value=BinOp(
  16.                         left=Name(id='a', ctx=Load()),
  17.                         op=Add(),
  18.                         right=Name(id='b', ctx=Load())))],
  19.             decorator_list=[],
  20.             type_params=[]),
  21.         Assign(
  22.             targets=[
  23.                 Name(id='result', ctx=Store())],
  24.             value=Call(
  25.                 func=Name(id='add', ctx=Load()),
  26.                 args=[
  27.                     Constant(value=5),
  28.                     Constant(value=3)],
  29.                 keywords=[])),
  30.         Expr(
  31.             value=Call(
  32.                 func=Name(id='print', ctx=Load()),
  33.                 args=[
  34.                     Name(id='result', ctx=Load())],
  35.                 keywords=[]))],
  36.     type_ignores=[])
复制代码
2. 遍历 AST

你可以编写一个访问者(Visitor),遍历 AST 的各个节点,并对特定范例的节点举行处置处罚。比方,下面的代码将遍历 AST 并打印出全部函数界说的名称:
  1. import ast
  2. class FunctionNameLister(ast.NodeVisitor):
  3.     def visit_FunctionDef(self, node):
  4.         print(f"Function name: {node.name}")
  5.         # 继续遍历函数内部的节点
  6.         self.generic_visit(node)
  7. # 示例代码
  8. code = """
  9. def add(a, b):
  10.     return a + b
  11. def subtract(a, b):
  12.     return a - b
  13. """
  14. # 解析代码为 AST
  15. tree = ast.parse(code)
  16. # 创建访问者并遍历 AST
  17. lister = FunctionNameLister()
  18. lister.visit(tree)
复制代码
输出:
  1. Function name: add
  2. Function name: subtract
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表