来自shelve的python加载 - 我可以保留变量名吗?

时间:2013-05-30 22:29:13

标签: python variables load instance shelve

我正在教自己如何在python中编写基本游戏(基于文本 - 不使用pygame)。 (注意:我实际上没有进入“游戏”部分本身,因为我想确保首先找到基本的核心结构。)

我正在试图弄清楚如何实现保存/加载方案,以便游戏会话可以持续超出程序的运行状态。我做了一些搜索,一切似乎都指向酸洗或搁置作为最佳解决方案。

我的测试场景是用于保存和加载类的单个实例。具体来说,我有一个名为Characters()的类,并且(为了测试的缘故),该类的一个sigle实例被分配给一个名为pc的变量。 Character类的实例有一个名为name的属性,该属性最初设置为“DEFAULT”,但会在初始设置新游戏时根据用户输入进行更新。例如:

class Characters(object):
    def __init__(self):
        self.name = "DEFAULT"

pc = Characters()
pc.name = "Bob"

我也有(或将要)大量的函数,这些函数使用它们被赋予的变量来引用各种实例。例如,作为简化示例组成的可能是:

def print_name(character):
    print character.name

def run():
    print_name(pc)

run()

我计划有一个保存功能,它将使用当前信息打包pc实例(以及其他信息)(例如:使用更新的名称)。我还将有一个加载功能,允许用户播放已保存的游戏而不是开始新的游戏。根据我的阅读,负载可能会像这样:

*assuming info was saved to a file called "save1"
*assuming the pc instance was shelved with "pc" as the key

import shelve

mysave = shelve.open("save1")
pc = mysave["pc"]

我的问题是,搁置负载是否有办法“记住”与实例相关的变量名称,并自动执行该操作<< pc = mysave [“pc”]>>步?或者我可以将变量名称存储为字符串(ex作为键)并以某种方式使用该字符串来创建具有正确名称(pc)的变量?

我需要“保存”很多实例,并且可以使用循环自动执行该过程,但我不知道如何自动卸载到特定的变量名称。我是否真的必须单独和明确地重新签署每个人?我需要将实例设置回适当的变量名称bc我有一堆核心函数,这些函数使用变量名称引用特定实例(如上面给出的示例)。

想法?这是可能的,还是我没有看到完全不同的解决方案?

谢谢!

〜肋

1 个答案:

答案 0 :(得分:0)

当然,可能做类似的事情。由于架子本身就像一个字典,只需使用变量的名称作为键,将所有字符实例保存在其中的真实字典实例中。例如:

class Character(object):
    def __init__(self, name="DEFAULT"):
        self.name = name

pc = Character("Bob")

def print_name(character):
    print character.name

def run():
    print_name(pc)

run()

import shelve
mysave = shelve.open("save1")
# save all Character instances without the default name
mysave["all characters"] = {varname:value for varname,value in
                                globals().iteritems() if
                                    isinstance(value, Character) and
                                    value.name != "DEFAULT"}
mysave.close()

del pc

mysave = shelve.open("save1")
globals().update(mysave["all characters"])
mysave.close()

run()