1

这是我之前提出的一个问题的后续:Loading functions in pickle file that uses class wrapper,我想在类 wrapper 下腌制一个函数字典,但类 wrapper 模块无法加载。

我已经解决了这个问题,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)globals(),它们不是必需的,因为我只想使用 func_dict。

现在,当我使用以下方法加载腌制文件时:

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

我得到:

<In> func_dict_loaded.keys()

<Out> ['_dh', '__', 'dill', '_15', '__builtin__', '_i32', '_30', '_16', '_i15', quit', '_34', '_i11', '_i9', '_i8', '_i7', '_i6', '_i5', '_i4', '_i3', '_i2', _i1', '__package__', 'exit', 'get_ipython', '_i', '_i29', '_i26', '_i17', _i24', _i14', '_i22', '__doc__', '_i20', '_i16', '_i21', '_18', '_11', '_i34', __builtins__', '_ih', '_i28', 'sys', '_20', '_i27', '__name__', '___', '_i33', _', '_sh', '_i25', '_29', '_32', '_22', 'func_dict_loaded', '_i23', '_i13', _i12', '_iii', '_i10', '_13', '_12', '_ii', 'In', '_i31', '_i30', '_i19', _i18', _i35', '_oh', 'Out']

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

4

2 回答 2

0

也许我在这里遗漏了一些东西,但我希望这些func_dict_loaded.items()函数_i7func_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

正如你所看到的,简化到那种简单的程度,一切都有效。

于 2017-12-30T22:30:57.233 回答
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()

第一行是我在这里找到的提示

然后,当我加载.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

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

于 2017-12-31T14:45:10.717 回答