Python pickle теряет данные - PullRequest
       19

Python pickle теряет данные

2 голосов
/ 26 февраля 2011

У меня есть 4 вложенных класса, см. Пример:

class GameInfo:
    id = ""
    round = ""
    # ... etc

class Opponent:
    game_info = GameInfo()
    name = ""
    # ...

class Tournament:
    opponent_list = [] # list of Opponent objects
    # ...

class Journal(db.Model):
    picked_tournament = db.BlobProperty()  # here I put picked Tournament object

проблема заключается в следующем: когда я снимаю pickled_tournament в Journal, все данные из GameInfo теряются.Т.е. opponent.name показывает правильное значение, но opponent.game_info.id показывает пустую строку.

Я использую хранилище данных Google App Engine для хранения данных, а picked_tournament хранится в BlobProperty ().Для сериализации данных я призываю: journal.picked_tournament = pickle.dumps(tournament).Для загрузки данных я использую: tournament = pickle.loads(journal.picked_tournament)

Почему рассол не идет глубже двух уровней?

UPD: данные установлены следующим образом:

gi = GameInfo()
gi.id = "1234"
opp = Opponent()
opp.name = "John"
opp.game_info = gi
t = Tournament()
t.opponent_list.append(opp)
# etc...

UPD2:только что обнаружил, что все работает на сервере разработки, если база данных sqlite3, но не работает без sqlite3 и appspot!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

В конструкторе для вашего Opponent класса вы создаете единственную копию GameInfo, которая используется всеми экземплярами этого класса. Например:

>>> o1 = Opponent()
>>> o1.game_info.id = 5
>>> o2 = Opponent()
>>> o2.game_info.id
5

Вместо этого вам нужно создать один для каждого экземпляра Opponent. Сделайте это, инициализировав его в конструкторе, например:

class Opponent:
    def __init__(self):
        game_info = GameInfo()

Кроме того, поскольку это не 1990-е годы, вам действительно следует использовать новые классы стилей .

1 голос
/ 27 февраля 2011

На основе документации App Engine (я не пробовал на практике), попробуйте установить данные рассола в виде большого двоичного объекта:

journal.picked_tournament = db.Blob(pickle.dumps(tournament))

Если это не работает, убедитесь, что journal.picked_tournament == pickle.dumps (турнир).

...