这是我之前提出的一个问题的后续问题: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"))
无法访问功能词典!我需要做什么才能获得预期的输出?
答案 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
的结果。
感谢所有观看和评论/回答的人,我希望这可以帮助其他未来遇到类似问题的人!