要设置的拾取函数:获取值(以及如何传递**kwargs)



我有一个每天运行的程序,其中有许多对象a(需要一段时间才能创建,b(一旦构建完成,它们当天都是静态的,因此很适合进行pickle。

为了避免多次写这篇文章:

if object_pickle_exists:
obj = load_pickle_object
else:
obj = run_some_function_to_build_object()
pickle(obj) for later

相反,我试图构建一个基于pickle的函数;获取/设置";变量。

加载Pickle,否则运行函数并对其进行Pickle

def _dill(name, function_as_an_object, date = dt.date.today()):                                  
try:
with open('Pickles/'+name+'_'+date.strftime('%y-%b-%d'),'rb') as f:
obj = pickle.load(f)
return obj
except FileNotFoundError:
obj = function_as_an_object()
with open('Pickles/'+name+'_'+date.strftime('%y-%b-%d'),'wb') as f:
pickle.dump(obj, f)
return obj

问题1(有没有更好的方法来做到这一点/现有的一些包/

问题2(我想将**kwargs添加到_dill((中,但我不确定如何将这些kwargs传递到函数_as_an_object:

def _dill(name, function_as_an_object, date = dt.date.today(), **kwargs):                                  
try:
with open('Pickles/'+name+'_'+date.strftime('%y-%b-%d'),'rb') as f:
obj = pickle.load(f)
return obj
except FileNotFoundError:
obj = function_as_an_object(**kwargs) ??
with open('Pickles/'+name+'_'+date.strftime('%y-%b-%d'),'wb') as f:
pickle.dump(obj, f)
return obj

对Q1的回答:

我自己不是一个pickle或Clean代码专家,但我认为您处理异常的方式是对这种必要检查的一个很好的解决方案。Try/except块在使用过于广泛时会很难看,但会为您的功能提供一个安全层。如果你想在没有try/except块的情况下检查文件,请参阅本线程中使用os模块检查文件的内容。我希望这能有所帮助。

Q2:的简短回答

您的函数签名是正确的:

def _dill(name, function_as_an_object, date = dt.date.today(), **kwargs):

此外,您对function_as_an_object的调用在技术上是正确的。但是,根据函数的定义方式,传递过多、过少的参数或错误的数据类型可能会导致错误。

Q2:的更长答案

让我举一个简单的例子:

def function_as_an_object(x, y):
print("x =", x)
print("y =", y)
def foo(function_as_an_object, **kwargs):
function_as_an_object(**kwargs)
foo(function_as_an_object, x=1, y=2, z=3)

在这种情况下,foo使用它已接收到的关键字arguments调用function_as_an_object。但这将导致一个错误,因为function_as_an_object只接受两个参数。

python中的关键字参数返回一个字典,给定的名称,给定的值作为。请允许我解释您的_dill方法的以下假设函数调用:

_dill("filename", function_as_an_object, x="string value", y=20)

在上面显示的情况下,xy自变量存储在kwargs对象中,该对象本质上是一个字典。例如,您可以通过对kwargs变量进行迭代来访问这些值。有关更多信息,请参阅**kwargs上的极客换极客教程。现在,当您将kwargs传递给您的函数(function_as_an_object(**kwargs)(时,实际上是将x(字符串(和y(整数(的值按此顺序传递给函数。

总之,要注意您传递了多少关键字参数,以及您对kwargs做了什么。否则,您可能会很快遇到错误。

最新更新