当前位置:  开发笔记 > 编程语言 > 正文

Python:defaultdict在2.6中成为unmarshallable对象?

如何解决《Python:defaultdict在2.6中成为unmarshallable对象?》经验,为你挑选了2个好方法。

在Python 2.6中,defaultdict是否已成为不可编组的?以下在2.5下工作,在OS X 1.5.6上的"ValueError:unmarshallable object",python.org的python-2.6.1-macosx2008-12-06.dmg下失败了2.6:

from collections import defaultdict
import marshal
dd = defaultdict(list)
marshal.dump(dd, file('/tmp/junk.bin','wb') )

Miles.. 11

故意将Marshal更改为不支持内置类型的子类.Marshal从来不应该处理违约,但碰巧因为它们是dict的子类. 元帅不是一般的"持久性"模块; 仅支持None,整数,长整数,浮点数,字符串,Unicode对象,元组,列表,集,字典和代码对象.

Python 2.5:

>>> marshal.dumps(defaultdict(list))
'{0'
>>> marshal.dumps(dict())
'{0'

如果由于某种原因你真的想编组一个defaultdict,你可以先把它转换为dict,但是你应该使用不同的序列化机制,比如酸洗.



1> Miles..:

故意将Marshal更改为不支持内置类型的子类.Marshal从来不应该处理违约,但碰巧因为它们是dict的子类. 元帅不是一般的"持久性"模块; 仅支持None,整数,长整数,浮点数,字符串,Unicode对象,元组,列表,集,字典和代码对象.

Python 2.5:

>>> marshal.dumps(defaultdict(list))
'{0'
>>> marshal.dumps(dict())
'{0'

如果由于某种原因你真的想编组一个defaultdict,你可以先把它转换为dict,但是你应该使用不同的序列化机制,比如酸洗.



2> dsvensson..:

wrt性能问题..编码一个~600000个dicts的列表,每个包含4个键/值,其中一个值有一个列表(大约1-3个长度)的2个键/ val dicts:

In [27]: timeit(cjson.encode, data)
4.93589496613

In [28]: timeit(cPickle.dumps, data, -1)
141.412974119

In [30]: timeit(marshal.dumps, data, marshal.version)
1.13546991348

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有