2010-10-22

Дружим pickle и __slots__

Баян, наверное, но я вот только сегодня столкнулся с такой проблемой и её решения в рунете не нашёл.
Делаем раз:
class Foo(object):
__slots__ = ['foo']
Делаем два:
import pickle
pickle.dumps(Foo()) # низя
И получаем ошибку: TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled.
Оказывается, всё до неприличия просто. По умолчанию, при сериализации, используется старинный протокол (номер ноль, pickle.dumps(Foo(), 0)), и вот он как раз и не может разрулить наши __slots__. В данной ситуации стоит использовать более продвинутый протокол (сейчас это номер 2, более старым версиям такой объект не по зубам):
import pickle
pickle.dumps(Foo(), -1) # годится
pickle.dumps(Foo(), 2) # тоже

p.s. Пытался сериализовать объекты Genshi.

1 комментарий:

Анонимный комментирует...

Спасибо. Пригодилось.