You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TypeScript提取Python文件中的函数声明(含签名、代码与注释)

使用TypeScript处理Python AST提取完整函数字符串的方案
  • 前提准备:除了已解析得到的codeAST,需保留原始Python代码的文本内容(读取文件时直接存储为字符串)——因为AST默认不包含行注释信息,必须结合行号截取完整代码段。

  • 步骤1:筛选AST中的函数节点
    遍历codeAST.body数组,筛选出所有类型为FunctionDef的节点(对应Python中用def定义的普通函数)。这类节点包含函数名、参数列表、起始行号(lineno)、结束行号(end_lineno)等核心信息。

  • 步骤2:通过行号截取完整函数文本
    将原始Python代码按换行符分割为行数组,利用函数节点的行号信息,截取对应行并拼接成完整的函数字符串。

    示例TypeScript代码:

    import { parse } from 'python-ast';
    
    // 原始Python代码文本
    const pythonCode = `def add(a, b):
        # Adds two numbers
        return a + b
    
    def subtract(a, b):
        # Subtracts two numbers
        return a - b`;
    
    // 解析得到AST
    const codeAST = parse(pythonCode);
    
    // 将原始代码分割为行数组(索引从0开始)
    const codeLines = pythonCode.split('\n');
    
    // 提取所有函数的完整字符串
    const functionStrings: string[] = [];
    for (const node of codeAST.body) {
      if (node.type === 'FunctionDef') {
        // 转换行号为数组索引(AST行号从1开始)
        const startIdx = node.lineno - 1;
        const endIdx = node.end_lineno - 1;
        // 截取并拼接函数代码行
        const funcLines = codeLines.slice(startIdx, endIdx + 1);
        const funcStr = funcLines.join('\n');
        functionStrings.push(funcStr);
      }
    }
    
    // 遍历输出结果
    functionStrings.forEach((str, idx) => {
      console.log(`str${idx+1}:\n${str}`);
    });
    
  • 可选:单独提取签名、函数体、注释

    • 函数签名:基于FunctionDef节点属性拼接,示例:def ${node.name}(${node.args.args.map(arg => arg.arg).join(', ')})
    • 函数体:使用python-ast的generate方法,将node.body节点转回代码字符串
    • 行注释:由于AST不保存行注释,需从原始代码的对应行中提取(检查行内容是否以#开头)

内容的提问来源于stack exchange,提问作者Joe Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:32