给定一个函数的参数a
和其它两个参数(pickle_from
,pickle_to
),我想:输入/输出装饰器泡菜函数结果
- 负载并返回位于
pickle_from
酸洗对象,如果pickle_from
不是None
。如果是None
,则计算a
的某个函数并将其返回。 - 如果
pickle_to
不是None
,则将上述结果转储到pickle_to
。
使用单一功能很简单。如果pickle_from
不为null,则该函数仅加载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:
# Re-calcualte some time-intensive func call
res = a ** 2
if pickle_to:
# Update pickled data with newly calculated `res`
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)
# or do params need to be in the decorator call?
# remember, "the files are in the computer"
res = a ** 2
return res
这可能吗?关于装饰者的事情让我的头部爆炸,所以我会礼貌地拒绝在这里发表“我试过的东西”。
不应该把pickle_from,pickle_to和pathname作为装饰器的参数吗?为什么'somefunc'有他们?无论你想要什么,你都可以拥有它们,但它会影响装饰者必须编码的方式。 –
我认为他们应该在函数本身中,因为它们被设计为由用户而不是代码本身指定。但是,因此我的问题 –
@很好,坚持下去。如果它们被赋予装饰器,那么在调用该函数时无法改变行为。它会永远或永不加载该值。 – mwchase