Я пытаюсь сбросить пользовательский класс с помощью pickle.Класс был разделен на подклассы из gtk.ListStore, так как это облегчало сохранение определенных данных и затем отображало их с помощью gtk.Это можно воспроизвести, как показано здесь.
import gtk
import pickle
import os
class foo(gtk.ListStore):
pass
if __name__=='__main__':
x = foo(str)
with open(os.path.expandvars('%userprofile%\\temp.txt'),'w') as f:
pickle.dump(x,f)
Решение, которое я попробовал, состояло в том, чтобы добавить функцию __getstate__
в мой класс.Насколько я понимаю документация , это должно иметь приоритет для pickle, чтобы он больше не пытался сериализовать ListStore, что он не может сделать.Тем не менее, я все равно получаю ту же ошибку от pickle.dump, когда пытаюсь засолить свой объект.Ошибка может быть воспроизведена следующим образом.
import gtk
import pickle
import os
class foo(gtk.ListStore):
def __getstate__(self):
return 'bar'
if __name__=='__main__':
x = foo(str)
with open(os.path.expandvars('%userprofile%\\temp.txt'),'w') as f:
pickle.dump(x,f)
В каждом случае pickle.dump вызывает ошибку TypeError, «не может выбирать объекты ListStore».Используя операторы print, я убедился, что функция __getstate__
запускается при использовании pickle.dump.Я не вижу никаких подсказок относительно того, что делать дальше из документации, и поэтому я немного затруднен.Есть предложения?