将函数结果pickle化的输入/输出装饰器

23 浏览
0 Comments

将函数结果pickle化的输入/输出装饰器

给定一个带有参数a和另外两个参数(pickle_frompickle_to)的函数,我想要:

  • 如果pickle_from不是None,则加载并返回位于pickle_from位置的被pickled对象。如果pickle_fromNone,则计算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

这可行吗?装饰器的某些东西让我头疼,所以我会礼貌地拒绝在这里发布“我尝试过什么”。

0