加载包含函数字典的pickled(dill)文件

时间:2017-12-30 20:03:53

标签: python pickle dill

这是我之前提出的一个问题的后续问题:Loading functions in pickle file that uses class wrapper,我想在其中挑选一个函数under class wrappers的字典,但是类包装器模块无法加载。< / p>

我已经使用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="parallax3"> </div>代替dill解决了这个问题:

pickle

我从func_dict = lowess_record() wanted = ['func_dict', 'Interp1dPicklable', 'PolyValPicklable', 'dill', '__builtins__', 'wanted'] for name in globals().keys(): if name not in wanted: del globals()[name] del globals().wanted with open('./func_dict.p', 'wb') as f: dill.dump(globals(), f) 删除了一些不必要的变量(涉及从数据创建func_dict),它们并不需要,因为我只想使用func_dict。

现在我使用以下方式加载pickle文件:

globals()

我明白了:

func_dict_loaded = dill.load(open("./func_dict.p", "rb"))

无法访问功能词典!我需要做什么才能获得预期的输出?

2 个答案:

答案 0 :(得分:0)

也许我在这里遗漏了一些内容,但我希望这些功能位于func_dict_loaded.items(),如果你想调用函数_i7,那么你会func_dict_loaded['_i7']()

我尝试重现您的问题,但避免操纵globals()。这不是一件安全的事情。你不需要这样做来制作功能的词典,你可以创建自己的功能。

所以,在一次会议中:

>>> import dill
>>> def myfunc():
        print("Hello world")
>>> mydict = {"myfunc": myfunc}
>>> with open (r"C:\..etc..\Temp\dict.p","wb") as f:
        dill.dump(mydict,f)

在另一场会议中:

>>> import dill
>>> mydict=dill.load(open (r"C:\..etc..\Temp\dict.p","rb"))
>>> mydict
{'myfunc': <function myfunc at 0x000001FC9F4C69D8>}
>>> mydict["myfunc"]()
Hello world

正如你所看到的那样,简化到这个简单程度,一切正常。

答案 1 :(得分:0)

我好像修好了,这是怎么回事:

转储函数字典时,而不是:

dill.dump(globals(), f)

我用过:

dill.settings['recurse'] = True

with open('./Data/function_dict.p', 'wb') as f:
    dill.dump([dill, interp1d, Interp1dPicklable, PolyValPicklable, func_dict], f)
f.close()

第一行是我找到here

的提示

然后,当我加载.p文件时,我打电话:

dill.settings['recurse'] = True

func_dict_loaded = dill.load(open("./Data/function_dict.p", "rb"))

(不确定那里是否需要第一行,但似乎没有任何伤害。)

然后:

func_dict_loaded[-1]

返回func_dict(注意转储时列表的顺序)。

然后我可以使用

func_dict_loaded[-1]['func1'](x)

返回func_1变量x的结果。

感谢所有观看和评论/回答的人,我希望这可以帮助其他未来遇到类似问题的人!