当前位置: 首页 > news >正文

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

相关文章:

  • 基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码+数据库+文档+PPT)
  • 【Python · PyTorch】循环神经网络 RNN(基础应用)
  • HTTP四次挥手是什么?
  • 本地搭建Ollama运行各种平台的大模型(deepseek),配合AnythingLLM-UI界面使用
  • Python--面向对象进阶(下)
  • LeetCode-154. 寻找旋转排序数组中的最小值 II
  • HarmonyOS 中 Navigation 组件的应用困境与应对策略
  • 进程优先级和进程切换 ─── linux第12课
  • Windows逆向工程入门之MASM数据结构使用
  • ssm整合项目实现基础查询功能
  • 整数对最小和
  • 代数结构—笔记
  • 逻辑运算 | 位运算
  • 计算机网络:Socket网络编程 Udp与Tcp协议 第一弹
  • 基于SpringBoot+Vue的电影订票及评论网站的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Java中String,StringBuffer,StringBuilder详解
  • 一文熟悉新版llama.cpp使用并本地部署LLAMA
  • [Windows] 免费电脑控制手机软件 极限投屏_正式版_3.0.1 (QtScrcpy作者开发)
  • Python利用pyobdc和tkinter框架连接数据库2-保存配置文件
  • 最新最详细的配置Node.js环境教程
  • 赖清德为“临阵脱逃”作准备,国台办:绝不会任“台独”祸首逍遥法外
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,市场有望迎来新增量需求
  • 通辽警方侦破一起积压21年的命案:嫌疑人企图强奸遭反抗后杀人
  • 山东枣庄同一站点两名饿了么骑手先后猝死,当地热线:职能部门正调查
  • 上海交大计算机学院成立,设多个拔尖人才特色班
  • 航行警告:渤海海峡黄海北部执行军事任务,禁止驶入