Python: defaultdict стал неустранимым объектом в 2.6? - PullRequest
9 голосов
/ 20 марта 2009

Не стал ли defaultdict маршалом с Python 2.6? Следующее работает под 2.5, терпит неудачу под 2.6 с «ValueError: unmarshallable object» на OS X 1.5.6, python-2.6.1-macosx2008-12-06.dmg от python.org:

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

Ответы [ 2 ]

11 голосов
/ 20 марта 2009

Маршал был намеренно изменен, чтобы не поддерживать подклассы встроенных типов . Маршал никогда не должен был заниматься дефолтами, но это произошло потому, что они являются подклассом диктата. Маршал - это , а не общий модуль "персистентности"; только None, целые числа, длинные целые числа, числа с плавающей запятой, строки, объекты Unicode, кортежи, списки, наборы, словари и объекты кода .

Python 2.5:

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

Если по какой-то причине вы действительно хотите маршализовать дефолтный приговор, вы можете сначала преобразовать его в диктовку, но, скорее всего, вам следует использовать другой механизм сериализации, например pickling .

7 голосов
/ 03 июня 2009

из-за проблем с производительностью. Кодирование списка из ~ 600000 диктов, каждое из которых имеет 4 ключа / значения, одно из значений имеет список (длиной около 1-3) из 2 ключей / значений:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...