Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2012 20:19:56

PPL
Зарегистрирован: 2012-04-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с модулем Pickle

Появилась необходимость сохранять объекты в файл. Есть класс 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 = []

…Дальше методы создания и работы с экземплярами B…

Что я делаю не так?

Отредактировано PPL (Апрель 8, 2012 20:21:29)

Офлайн

#2 Апрель 8, 2012 21:17:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Работа с модулем Pickle

Да правильно все делаете. Может интерпретируете не правильно что должно получиться.
В пикл сохраняется только имя типа и данные экземпдяра. Реализация типа описывается в питоновском файле. У вас в объекте типа A ничего кроме пустого списка и нет.



Офлайн

#3 Апрель 8, 2012 22:07:00

PPL
Зарегистрирован: 2012-04-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с модулем Pickle

В том то и дело, что во время работы создаются экземпляры B и список заполняется, так что меня удивляет то, что на выходе я получаю пустой список. Я просто привёл схему своего класса и не стал приводить остальные методы класса A (создание и изменение экземпляров B и т.д.), т.к. они всё равно не сохраняются. Во время сохранения пикла список точно не пуст, в нём как минимум три экземпляра B есть. Или он не сохраняет данные о вложенных экземплярах других классов?

Отредактировано PPL (Апрель 8, 2012 22:16:34)

Офлайн

#4 Апрель 9, 2012 00:32:30

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Работа с модулем Pickle

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)

Офлайн

#5 Апрель 9, 2012 11:44:23

PPL
Зарегистрирован: 2012-04-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с модулем Pickle

Всё, проблема решена. Даже обошлось без __repr__. Во-первых, я забыл поставить global в методе, где происходит пикл/анпикл, так что видимо он всё время пытался запиклить какой-то другой объект. После этого он стал жаловаться на то, что класса classes.B не существует. Не знаю с чем это связано и почему он его искал на верхнем уровне модуля, а не внутри класса в котором он объявлен, но проблема решилась выносом класса B из A. Теперь всё работает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version