使用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
相关产品推荐
相关产品推荐

