【发布时间】:2018-02-02 14:42:28
【问题描述】:
给定一个带有参数a 和其他两个参数(pickle_from、pickle_to)的函数,我想:
- 如果
pickle_from不是None,则加载并返回位于pickle_from的腌制对象。如果是None,计算a的某个函数并返回。 - 如果
pickle_to不是None,则将上述结果转储到pickle_to。
只有一个函数,这很简单。如果pickle_from 不为空,该函数只会加载腌制结果并返回它。否则,它会使用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有它们?你可以随心所欲地拥有它们,但这会影响装饰器的编码方式。 -
我认为它们应该在函数本身中,因为它们被设计为由用户指定,而不是在代码本身中。但因此我的问题
-
@Rawing 好,等一下。如果将它们提供给装饰器,则在调用函数时无法更改行为。它要么总是加载,要么永远不加载值。
-
@mwchase 正确,这就是我想说的。
-
somefunc会使用pickle_from和pickle_to参数吗?你可以让装饰器提供这些参数,然后你就不必每次都定义它们。
标签: python python-3.x decorator pickle python-decorators