Python 为什么可以';t dill/pickle类定义?

Python 为什么可以';t dill/pickle类定义?,python,pickle,dill,Python,Pickle,Dill,dill是处理大多数Python对象的好工具,我在IPython并行中使用它来序列化计算。我一直在讨论的一个问题是关于类定义的问题。我得到的一个错误解释如下 在尝试序列化类定义时,我不断从dill获取AssertionError。我想知道为什么其中一个工作,而另一个失败: class MyClassEmpty(object): pass class MyClassInit(object): def __init__(self): super(MyClassIni

dill
是处理大多数Python对象的好工具,我在IPython并行中使用它来序列化计算。我一直在讨论的一个问题是关于类定义的问题。我得到的一个错误解释如下

在尝试序列化类定义时,我不断从
dill
获取
AssertionError
。我想知道为什么其中一个工作,而另一个失败:

class MyClassEmpty(object):
    pass

class MyClassInit(object):
    def __init__(self):
        super(MyClassInit).__init__()

dill.dumps(MyClassEmpty)  # returns: '\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0cMyClassEmptyq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\n__module__q\x0bU\x08__main__q\x0cU\x07__doc__q\rNutq\x0eRq\x0f.'

dill.dumps(MyClassInit)  # AssertionError at line 244 of MyClassEmpty (assert id(obj) not in self.memo)

我在使用dill 0.2.2的Python2.7.6上。

我是
dill
的作者。应该解决
super
问题--请参阅:

>>类MyClassEmpty(对象):
...   通过
... 
>>>类MyClassInit(对象):
...   定义初始化(自):
...     超级(MyClassInit)。\uuuuInit\uuuu()
... 
>>>进口莳萝
>>> 
>>>dill.dumps(MyClassEmpty)
“\x80\x02cdill.dill\n\U创建类型\nq\x00(cdill.dill\n\U加载类型\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0cMyClassEmptyq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}\n(单元模块\uu\x0bU\x0bU\x0bU\x08\uq\x0ru\x0c\uq\x0f
>>>莳萝转储(MyClassInit)
“x80\x80\x80\XX0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0 l\n\U创建\U函数\nq\x0f(cdill.dill.dill.dill\n\n\n\n“不玛玛撒”的“不玛撒”的“不玛撒”的“不玛玛撒”的“对地里的“对地里的“对地里的“对地里的“对地里的”的“对地里的“对地里的“对地里的”的“对地上的“对地上的”的“对地上的“对地上的”的“对”的“对地上的“对”的“对地上的“对”对”的“对”的“对”的“对“对地上的“对”对”的“对“对“对”的“对地里的“对”对”的“对”的“对”的“对“对地里的“对“对”的“对”的“对”的“对”的“对“对”的“对”的“对“对“对“对”对”对”对”对”的“t\x08\x00\x00\x00\uuuuuuuuuuuuuuuuuu(\x01\x00\x00\x00t\x04\x00\x00\x00\x00\x00self(\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00s\x07\x00\x00\x00\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x00s\x01q\x11\x85q\x12Rq\x13c\uuuuuuuuuuuuuuuuu\nh\x0eNN}q\x14tq\x15Rq\x16utq\x18rq\x18.)
>>> 
>>>类MyClassInit2(对象):
…定义初始化(自):
…超级(MyClassInit,self)。\uuuu init\uuuuu()
... 
>>>dill.dumps(MyClassInit2)
“x80\x80\x80\XX0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0 l\n\U创建\U函数\nq\x0f(cdill.dill.dill.dill\n\n\n\n\n“不制造任何一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的城市的00\x00\x00mycassinit\x08\x00\x00\x00\uuuuuu init\uuuuuu(\x01\x00\x00\x00t\x04\x00\x00\x00\x00self(\x00\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00\x02\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x00\x00\x01q\x11\x85q\x12Rq\x13c\uuuu\uuu\uuuuu\nh\u0enn\x0eNN}\x14tq\x15Rq\x16uq\x18.)

顺便说一句:
dill
punt到
pickle
对于某些涉及类(主要)的情况,并且
pickle
抛出一个
AssertionError
作为它可能引发的3-4个错误之一。为什么不存在一个
PicklingError
我不知道…这可能更可取。

我是
dill
的作者。
super
问题应该得到解决——请参阅:

>>类MyClassEmpty(对象):
通过
... 
>>>类MyClassInit(对象):
…定义初始化(自):
…超级(MyClassInit)。\uu初始化
... 
>>>进口莳萝
>>> 
>>>dill.dumps(MyClassEmpty)
“\x80\x02cdill.dill\n\U创建类型\nq\x00(cdill.dill\n\U加载类型\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0cMyClassEmptyq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}\n(单元模块\uu\x0bU\x0bU\x0bU\x08\uq\x0ru\x0c\uq\x0f
>>>莳萝转储(MyClassInit)
“x80\x80\x80\XX0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0 l\n\U创建\U函数\nq\x0f(cdill.dill.dill.dill\n\n\n\n“不玛玛撒”的“不玛撒”的“不玛撒”的“不玛玛撒”的“对地里的“对地里的“对地里的“对地里的“对地里的”的“对地里的“对地里的“对地里的”的“对地上的“对地上的”的“对地上的“对地上的”的“对”的“对地上的“对”的“对地上的“对”对”的“对”的“对”的“对“对地上的“对”对”的“对“对“对”的“对地里的“对”对”的“对”的“对”的“对“对地里的“对“对”的“对”的“对”的“对”的“对“对”的“对”的“对“对“对“对”对”对”对”对”的“t\x08\x00\x00\x00\uuuuuuuuuuuuuuuuuu(\x01\x00\x00\x00t\x04\x00\x00\x00\x00\x00self(\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00s\x07\x00\x00\x00\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x00s\x01q\x11\x85q\x12Rq\x13c\uuuuuuuuuuuuuuuuu\nh\x0eNN}q\x14tq\x15Rq\x16utq\x18rq\x18.)
>>> 
>>>类MyClassInit2(对象):
…定义初始化(自):
…超级(MyClassInit,self)。\uuuu init\uuuuu()
... 
>>>dill.dumps(MyClassInit2)
“x80\x80\x80\XX0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0\X0 l\n\U创建\U函数\nq\x0f(cdill.dill.dill.dill\n\n\n\n\n“不制造任何一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的一个城市的城市的00\x00\x00mycassinit\x08\x00\x00\x00\uuuuuu init\uuuuuu(\x01\x00\x00\x00t\x04\x00\x00\x00\x00self(\x00\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00\x02\x00\x00\x00\x00s\x02\x00\x00\x00\x00\x00\x00\x00\x00\x01q\x11\x85q\x12Rq\x13c\uuuu\uuu\uuuuu\nh\u0enn\x0eNN}\x14tq\x15Rq\x16uq\x18.)

顺便说一句:
dill
punt到
pickle
对于某些涉及类(主要)的情况,并且
pickle
抛出一个
AssertionError
作为它可能引发的3-4个错误之一。为什么不存在一个
PicklingError
我不知道…这可能更可取。

你读过例如吗?另外,你的
super
调用似乎不正确-那应该是
super(我的classinit,self)。\uu
。我可以执行它,不会抛出断言错误。Tha
>>> class MyClassEmpty(object):
...   pass
... 
>>> class MyClassInit(object):
...   def __init__(self):
...     super(MyClassInit).__init__()
... 
>>> import dill
>>> 
>>> dill.dumps(MyClassEmpty)
'\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0cMyClassEmptyq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\n__module__q\x0bU\x08__main__q\x0cU\x07__doc__q\rNutq\x0eRq\x0f.'
>>> dill.dumps(MyClassInit) 
'\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0bMyClassInitq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\n__module__q\x0bU\x08__main__q\x0cU\x07__doc__q\rNU\x08__init__q\x0ecdill.dill\n_create_function\nq\x0f(cdill.dill\n_unmarshal\nq\x10U\x90c\x01\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\x14\x00\x00\x00t\x00\x00t\x01\x00\x83\x01\x00j\x02\x00\x83\x00\x00\x01d\x00\x00S(\x01\x00\x00\x00N(\x03\x00\x00\x00t\x05\x00\x00\x00supert\x0b\x00\x00\x00MyClassInitt\x08\x00\x00\x00__init__(\x01\x00\x00\x00t\x04\x00\x00\x00self(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>R\x02\x00\x00\x00\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x11\x85q\x12Rq\x13c__builtin__\n__main__\nh\x0eNN}q\x14tq\x15Rq\x16utq\x17Rq\x18.'
>>> 
>>> class MyClassInit2(object):
...   def __init__(self):
...     super(MyClassInit, self).__init__()
... 
>>> dill.dumps(MyClassInit2)
'\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x0cMyClassInit2q\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\n__module__q\x0bU\x08__main__q\x0cU\x07__doc__q\rNU\x08__init__q\x0ecdill.dill\n_create_function\nq\x0f(cdill.dill\n_unmarshal\nq\x10U\x93c\x01\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\x17\x00\x00\x00t\x00\x00t\x01\x00|\x00\x00\x83\x02\x00j\x02\x00\x83\x00\x00\x01d\x00\x00S(\x01\x00\x00\x00N(\x03\x00\x00\x00t\x05\x00\x00\x00supert\x0b\x00\x00\x00MyClassInitt\x08\x00\x00\x00__init__(\x01\x00\x00\x00t\x04\x00\x00\x00self(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>R\x02\x00\x00\x00\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x11\x85q\x12Rq\x13c__builtin__\n__main__\nh\x0eNN}q\x14tq\x15Rq\x16utq\x17Rq\x18.'