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

如何从Python脚本中仅保留函数,移除模块级代码生成新脚本?

提取Python脚本中的函数生成新文件的实现方案

方法一:利用Python AST(抽象语法树)解析(推荐)

AST是Python官方提供的语法解析工具,能精准识别代码结构,避免正则表达式的误判问题,适合绝大多数场景。

实现步骤:

  1. 读取原脚本的内容
  2. 将代码解析为AST语法树
  3. 遍历语法树,筛选出所有函数定义节点(FunctionDef类型)
  4. 基于筛选后的节点重新生成合法的Python代码
  5. 将生成的代码写入目标文件

示例代码:

import ast
import astunparse

def extract_functions(source_code):
    # 解析源代码为AST树
    tree = ast.parse(source_code)
    # 筛选出所有函数定义节点
    function_nodes = [node for node in tree.body if isinstance(node, ast.FunctionDef)]
    # 构建新的模块AST节点
    new_module = ast.Module(body=function_nodes, type_ignores=[])
    # 把AST转换回代码字符串,astunparse比内置的ast.dump更贴近原始格式
    return astunparse.unparse(new_module).strip()

# 读取bar.py内容
with open('bar.py', 'r', encoding='utf-8') as f:
    original_content = f.read()

# 提取函数代码
pure_function_code = extract_functions(original_content)

# 写入bar_fun.py
with open('bar_fun.py', 'w', encoding='utf-8') as f:
    f.write(pure_function_code)

优势:

  • 准确识别函数定义,不会误匹配字符串、注释中的def关键字
  • 自动保留函数的缩进、嵌套结构等格式
  • 支持处理包含类、嵌套函数等复杂结构的脚本

方法二:正则表达式(仅适合简单场景)

如果你的脚本结构非常简单(无嵌套函数、无字符串/注释中的def),可以用正则快速实现,但局限性较大。

示例代码:

import re

def extract_functions_regex(source_code):
    # 匹配以def开头的函数定义,适配多行函数体(简单版本)
    func_pattern = re.compile(
        r'^def\s+\w+\([^)]*\):\s*\n(?:^\s+.+\n)*',
        re.MULTILINE | re.DOTALL
    )
    return '\n'.join(func_pattern.findall(source_code))

# 读取并处理文件
with open('bar.py', 'r', encoding='utf-8') as f:
    content = f.read()

with open('bar_fun.py', 'w', encoding='utf-8') as f:
    f.write(extract_functions_regex(content))

局限性:

  • 无法处理def出现在字符串、注释中的情况,会误匹配
  • 对嵌套函数、复杂缩进的函数体处理容易出错
  • 无法识别带有装饰器的函数(需要修改正则表达式)

总结

优先选择AST方法,它能稳定处理各种复杂的Python代码结构;正则仅适合代码结构极度简单的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:01:10