Help with saving and restoring program state
Larry Bates
lbates at syscononline.com
Mon Jan 24 19:50:41 EST 2005
Take a look at Zope. The ZODB is a highly optimized object
database that handles the pickling, loading, saving, etc. of
Python objects for restoring program state. A ZODB beginner's
tutorial is available here:
http://www.h7.dion.ne.jp/~harm/ZODB-Tutorial.py
Other info at:
http://zope.org/Members/adytumsolutions/HowToLoveZODB_PartII/HowToLoveZODB_PartI
http://zope.org
Hope information helps.
Larry Bates
Jacob H wrote:
> Hello list...
>
> I'm developing an adventure game in Python (which of course is lots of
> fun). One of the features is the ability to save games and restore the
> saves later. I'm using the pickle module to implement this. Capturing
> current program state and neatly replacing it later is proving to be
> trickier than I first imagined, so I'm here to ask for a little
> direction from wiser minds than mine!
>
> When my program initializes, each game object is stored in two places
> -- the defining module, and in a list in another module. The following
> example is not from my actual code, but what happens is the same.
>
> (code contained in "globalstate" module)
> all_fruit = []
>
> (code contained in "world" module)
> class Apple(object): # the class hierarchy goes back to object, anyway
> def __init__(self):
> self.foo = 23
> self.bar = "something"
> globalstate.all_fruit.append(self)
> apple = Apple()
>
> I enjoy the convenience of being able to refer to the same apple
> instance through world.apple or globalstate.all_fruit, the latter
> coming into play when I write for loops and so on. When I update the
> instance attributes in one place, the changes are reflected in the
> other place. But now comes the save and restore game functions, which
> again are simplified from my real code:
>
> (code contained in "saveload" module)
> import pickle
> import world
> def savegame(path_to_name):
> world_data = {}
> for attr, value in world.__dict__.items():
> # actual code is selective about which attributes
> # from world it takes -- I'm just keeping this
> # example simple
> world_data[attr] = value
> fp = open(path_to_name, "w")
> pickle.dump(world_data, fp)
> fp.close()
>
> def loadgame(path_to_name):
> fp = open(path_to_name, "r")
> world_data = pickle.load(fp)
> for attr, value in world_data.items():
> setattr(world, attr, value)
> fp.close()
>
> The problem is that the game objects only get overwritten in the world
> module. The instances in the globalstate.all_fruit list remain
> unchanged, which is not the behaviour I want. I started to write code
> to get around this. I figured that with each loadgame call, I could
> reset all the lists in globalstate to empty, then reappend each game
> object to the appropriate list. But this possibility got complicated
> fast, because all game objects belong to more than one list. My apple
> instance alone would belong to globalstate.all_things,
> globalstate.all_fruit, globalstate.all_items, and perhaps others. Some
> of the game objects contained in these lists don't need to be a part
> of capturing program state in the first place! But I'm stuck, because
> unpickling (so far as I understand it) creates a brand new instance
> that doesn't know it used to have references to itself in the
> globalstate lists.
>
> Any advice out there? I'm looking for a clean, elegant way to
> overwrite the same class instance in two arbitrary places at once.
> Perhaps the example code I've provided isn't even the best way of
> saving and restoring program state. Perhaps I can easily update my
> globalstate lists and I'm just overlooking the simple way. Or perhaps
> the solution lies in abandoning the concepts of referencing my game
> objects through module attributes and lists. I'm open to any
> suggestions.
>
> Thanks in advance for any help!
>
> Jacob
More information about the Python-list
mailing list