Ошибка Pilton Pickling Slots

У меня есть большой экземпляр, который я отлично рисовал, но в последнее время я начал получать эту ошибку, когда пытался ее сбросить:

File "/usr/lib/python2.6/copy_reg.py", line 77, in _reduce_ex raise TypeError("a class that defines __slots__ without " TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled 

Я не понимаю эту ошибку, так как все мои классы, как представляется, определяют метод __getstate__ , и ни один из них не определяет __slots__ . У меня возникли проблемы с отключением изменения, которое я вызвал эту ошибку.

Я могу только предположить, что в моем экземпляре есть какой-то объект, вложенный в мой экземпляр, который вызывает это. Есть ли способ получить больше информации? Как найти класс точного объекта, запускающего эту ошибку?

2 Solutions collect form web for “Ошибка Pilton Pickling Slots”

Используйте бинарный протокол для травления (вместо старого ASCII, который вы, по-видимому, не выполняете), и все будет в порядке. Заметим:

 >>> class ws(object): ... __slots__ = 'a', 'b' ... def __init__(self, a=23, b=45): self.a, self.b = a, b ... >>> x = ws() >>> import pickle >>> pickle.dumps(x, -1) '\x80\x02c__main__\nws\nq\x00)\x81q\x01N}q\x02(U\x01aq\x03K\x17U\x01bq\x04K-u\x86q\x05b.' >>> pickle.dumps(x) Traceback (most recent call last): [[snip]] File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/copy_reg.py", line 77, in _reduce_ex raise TypeError("a class that defines __slots__ without " TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled >>> 

Как вы видите, протокол -1 (что означает «лучший, самый быстрый и самый компактный протокол») работает очень хорошо, а протокол по умолчанию 0 (старый протокол ascii, разработанный для совместимости с Python 1.5 и ранее) дает точно исключение, которое вы наблюдали.

Кроме того, -1 будет быстрее и даст более компактные результаты – вам просто нужно убедиться, что вы правильно сохраните и восстановите двоичные строки, которые он производит (так, например, если вы травируете файл, обязательно откройте последнюю для wb , а не только w ).

Если по какой-то причине это решение «все вокруг» не доступно вам, есть хаки и трюки (например, подкласс pickle.Pickler , используйте непосредственно ваш подкласс, а не базовый, как pickle.dumps , переопределяют save метод, чтобы он отслеживал type(obj) до делегирования суперклассу), но при обновлении вправо самый современный протокол ( -1 гарантированно будет на любой заданной версии Python, самой продвинутой версии этой версии поддержки) было бы хорошей идеей, если это вообще возможно.

У меня была и эта проблема, но с некоторыми уже маринованными данными в старом ASCII-протоколе. Вы можете использовать эти методы для адаптации слота к вашему объекту:

 class MyAlreadyPickeldObjectWithslots(object): ___slots__= ("attr1","attr2",....) def __getstate__(self): return dict([(k, getattr(self,k,None)) for k in self.__slots__]) def __setstate__(self,data): for k,v in data.items(): setattr(self,k,v) 

Это может быть полезно для увеличения объема ОЗУ

  • Почему возникает неожиданное поведение на Python после травления?
  • Python: pickle.loads не удалось выполнить экземпляр класса
  • Python: Как написать список в файл, а затем вывести его обратно в память (dict, представленный как преобразование строки в dict) позже?
  • Как проверить, является ли объект разборчивым
  • Травление питона после изменения каталога модуля
  • AttributeError при распаковке объекта
  • Как рассолить себя?
  • Почему не добавляются бинарные соленые огурцы?
  • cPickle.UnpicklingError: недопустимый ключ загрузки
  • Как восстановить маринованный класс и его экземпляры
  • Как распиливать и распаковывать экземпляры класса, который наследуется от defaultdict?
  • Python - лучший язык программирования в мире.