繁体   English   中英

选择 function 来设置:获取值(以及如何传递 **kwargs)

[英]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,我通常可以使用它来“获取/设置”变量。

加载 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)

在上面显示的情况下, xy 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM