[英]How to pass **kwargs to another function with changed values for that key?
[英]Picking function to set:get values (and how to pass **kwargs)
我有一个每天运行的程序,其中有许多对象 a) 需要一段时间才能创建,b) 一旦构建完成,它们就是 static,因此是腌制的好人选。
为了避免多次写这个:
if object_pickle_exists:
obj = load_pickle_object
else:
obj = run_some_function_to_build_object()
pickle(obj) for later
相反,我试图构建一个基于 pickle 的 function,我通常可以使用它来“获取/设置”变量。
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)有没有更好的方法来做到这一点/一些现有的package/
问题 2)我想将 **kwargs 添加到 _dill(),但我不确定如何将这些 kwargs 传递给 function_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:
我自己不是泡菜或清洁代码专家,但我认为你处理异常的方式是这个必要检查的一个很好的解决方案。 Try/except 块在使用过于广泛时会很丑陋,但可以为您的 function 提供一个安全层。 如果您想检查没有 try/except 块的文件,请参阅this thread on checks for files with the os module 。 我希望这有帮助。
对 Q2 的简短回答:
您的 function 签名是正确的:
def _dill(name, function_as_an_object, date = dt.date.today(), **kwargs):
此外,您对function_as_an_object
的调用在技术上是正确的。 但根据 function 的定义方式,您可能会通过传递太多、很少的 arguments 或错误的数据类型而导致错误。
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 中的关键字 arguments 返回一个字典,其中给定名称作为键,给定值作为值。 请允许我解释您的_dill
方法的以下假设 function 调用:
_dill("filename", function_as_an_object, x="string value", y=20)
在上面显示的情况下, x
和y
arguments 存储在kwargs
object 中,它本质上是一个字典。 例如,您可以通过迭代 kwargs 变量来访问这些值。 有关更多信息,请参阅**kwargs 上的极客教程。 现在,当您将kwargs
传递给 function ( function_as_an_object(**kwargs)
) 时,您实际上是按此顺序将x
(字符串)和y
(整数)的值传递给 function。
总而言之,请注意您传递了多少关键字 arguments ,您正在使用您的kwargs
做什么。 否则,您很快就会遇到错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.