如何从Python脚本中仅保留函数,移除模块级代码生成新脚本?
提取Python脚本中的函数生成新文件的实现方案
方法一:利用Python AST(抽象语法树)解析(推荐)
AST是Python官方提供的语法解析工具,能精准识别代码结构,避免正则表达式的误判问题,适合绝大多数场景。
实现步骤:
- 读取原脚本的内容
- 将代码解析为AST语法树
- 遍历语法树,筛选出所有函数定义节点(
FunctionDef类型) - 基于筛选后的节点重新生成合法的Python代码
- 将生成的代码写入目标文件
示例代码:
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
相关产品推荐
相关产品推荐

