将函数结果pickle化的输入/输出装饰器
将函数结果pickle化的输入/输出装饰器
给定一个带有参数a
和另外两个参数(pickle_from
,pickle_to
)的函数,我想要:
- 如果
pickle_from
不是None
,则加载并返回位于pickle_from
位置的被pickled对象。如果pickle_from
是None
,则计算a
的某个函数并返回它。 - 如果
pickle_to
不是None
,则将上述结果转储到pickle_to
。
使用一个函数很简单。如果pickle_from
不为空,该函数只需加载pickled结果并返回。否则,它会使用a
进行一些耗时的计算,将结果转储到pickle_to
,并返回计算结果。
try: import cPickle as pickle except: import pickle def somefunc(a, pickle_from=None, pickle_to=None): if pickle_from: with open(pickle_from + '.pickle', 'rb') as f res = pickle.load(f) else: # 重新计算耗时的函数调用 res = a ** 2 if pickle_to: # 使用新计算的`res`更新pickled数据 with open(pickle_to + '.pickle', 'wb') as f: pickle.dump(res, f) return res
我的问题是如何构建一个装饰器,使得这个过程可以形成一个类似于somefunc
的外壳包裹多个函数,从而减少源代码。
我想要写出这样的代码:
@pickle_option def somefunc(a, pickle_from=None, pickle_to=None) # 或者参数是否需要在装饰器调用中? # 记住,“这些文件在电脑里” res = a ** 2 return res
这可行吗?装饰器的某些东西让我头疼,所以我会礼貌地拒绝在这里发布“我尝试过什么”。