函数执行失败时自动保存中间变量的Python装饰器是否存在?
解决方案:自定义异常捕获保存装饰器
你可以自己实现一个轻量的装饰器,完美匹配你的需求——在函数抛出异常时自动保存指定的中间变量,不用每次手动添加pickle代码。
实现装饰器
这个装饰器支持指定要保存的变量名和输出文件,捕获异常时自动保存局部变量并重新抛出异常,不影响原有错误流程:
import pickle from functools import wraps import inspect def save_on_exception(save_vars, filename='intermediate_result.pickle'): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception: # 获取函数执行时的局部变量 frame = inspect.currentframe().f_back local_vars = frame.f_locals # 收集需要保存的目标变量 saved_data = {var: local_vars[var] for var in save_vars if var in local_vars} # 写入文件 with open(filename, 'wb') as f: pickle.dump(saved_data, f) # 重新抛出异常,保留原错误信息 raise return wrapper return decorator
用法示例
直接给目标函数加上装饰器,指定要保存的中间变量名即可:
# 假设two_hour_computation和post_processing是已定义的函数 @save_on_exception(save_vars=['result']) def compute(input): result = two_hour_computation(input) result = post_processing(result) return result
当post_processing执行失败抛出异常时,装饰器会自动把result(也就是两小时计算的中间结果)保存到intermediate_result.pickle里,同时原异常会正常抛出,不影响你排查问题。
现成工具的替代思路
一些通用缓存库(比如joblib)主要用于缓存成功执行的结果,对于捕获异常时保存中间状态的场景,自定义装饰器反而更灵活,完全贴合你的业务流程。
内容的提问来源于stack exchange,提问作者Alex Lenail
相关产品推荐
相关产品推荐

