Форум сайта python.su
Появилась необходимость сохранять объекты в файл. Есть класс A, внутри которого объявлен класс B и есть лист, для хранения экземпляров класса B. При попытке сделать дамп pickle'ом, в файл что-то сбрасывается (судя по содержимому - название класса, которому принадлежит объект и пустой лист). Но экземпляров B там точно нет. И, конечно, после загрузки я получаю чистый A с пустым листом. Выглядит код примерно так:
class A(object): class B(object): def __init__(self,name,data): self.name = name self.data = data def __init__(self): self.container = []
Отредактировано PPL (Апрель 8, 2012 20:21:29)
Офлайн
Да правильно все делаете. Может интерпретируете не правильно что должно получиться.
В пикл сохраняется только имя типа и данные экземпдяра. Реализация типа описывается в питоновском файле. У вас в объекте типа A ничего кроме пустого списка и нет.
Офлайн
В том то и дело, что во время работы создаются экземпляры B и список заполняется, так что меня удивляет то, что на выходе я получаю пустой список. Я просто привёл схему своего класса и не стал приводить остальные методы класса A (создание и изменение экземпляров B и т.д.), т.к. они всё равно не сохраняются. Во время сохранения пикла список точно не пуст, в нём как минимум три экземпляра B есть. Или он не сохраняет данные о вложенных экземплярах других классов?
Отредактировано PPL (Апрель 8, 2012 22:16:34)
Офлайн
class A(object): class B(object): def __init__(self, name, data): self.name = name self.data = data def __repr__(self): return 'B: <name: {}, data: {}>'.format(self.name, self.data) def __init__(self): self.container = [] def addb(self, name, data): self.container.append((name, data)) def getb(self, name): for a, b in self.container: if a == name: return A.B(a, b) a1 = A() [a1.addb('test%d'%t, t) for t in xrange(5)] for t in xrange(5): print a1.getb('test%d'%t) print 'Saving...' pic = pickle.dumps(a1) print 'Restoring...' a2 = pickle.loads(pic) for t in xrange(5): print a2.getb('test%d'%t)
Офлайн
Всё, проблема решена. Даже обошлось без __repr__. Во-первых, я забыл поставить global в методе, где происходит пикл/анпикл, так что видимо он всё время пытался запиклить какой-то другой объект. После этого он стал жаловаться на то, что класса classes.B не существует. Не знаю с чем это связано и почему он его искал на верхнем уровне модуля, а не внутри класса в котором он объявлен, но проблема решилась выносом класса B из A. Теперь всё работает.
Офлайн