Dill / Pickle:转储自定义类对象

时间:2019-02-21 15:37:29

标签: python pickle dump dill

我试图实例化自定义类中的对象,同时设置一些类变量并转储该对象。然后,在另一个文件中,我想加载转储的对象以便检索类变量。我将在下面发布一个小示例:

import dill

class RandomClass:
    mean = 0
    def __init__(self):
        self.name = "random_name"
        self.set_mean(5)

    @classmethod
    def set_mean(cls, value):
        cls.mean = value

obj = RandomClass()
dill.dump(obj, open("test.pkl","wb"))

然后,我要执行以下操作来加载对象并检索类变量:

import dill
obj = dill.load(open("test.pkl", "rb"))
obj.mean

但是,在执行此操作时,出现以下错误:

  

文件“ /用户/用户名/库/缓存/ pypoetry / virtualenvs /项目名-py3.6 / lib / python3.6 / site-packages / dill / _dill.py”,第305行,加载obj = pik。加载()   文件“ / Users /用户名/库/缓存/pypoetry/virtualenvs/projectname-py3.6/lib/python3.6/site-packages/dill/_dill.py”,行_load_type       返回_reverse_typemap [name]

期待您的回答!

1 个答案:

答案 0 :(得分:0)

我是dill的作者。我无法重现您的错误。 参见下文({copy只是dump然后load):

Python 3.6.6 (default, Jun 28 2018, 05:53:46) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> class RandomClass:
...   mean = 0
...   def __init__(self):
...     self.name = "random_name"
...     self.set_mean(5)
...   @classmethod
...   def set_mean(cls, value):
...     cls.mean = value
... 
>>> obj = RandomClass()
>>> obj.mean
5
>>> dill.copy(obj)
<__main__.RandomClass object at 0x10747cba8>
>>> 

如果错误仍然存​​在,那么最好的方法可能是在dill GitHub页面上填写票证,并提供您正在使用的dill的版本以及您的操作系统。