2013-05-30 2 views
0

Я преподаю, как написать основную игру в python (на основе текста - не используя pygame). (Примечание: я фактически не попал в «игровую» часть вперёд, потому что я хотел убедиться, что сначала у меня есть базовая структура ядра.)python load from shelve - могу ли я сохранить имя переменной?

Я нахожусь в точке, где я пытаясь выяснить, как я могу реализовать сценарий сохранения/загрузки, чтобы игровой сеанс мог оставаться за пределами функции подписки на программу. Я сделал немного поиска, и все, кажется, указывает на травление или стеллажи как лучшие решения.

Мой тестовый сценарий предназначен для сохранения и загрузки одного экземпляра класса. В частности, у меня есть класс Characters() и (для тестирования) экземпляр sigle этого класса, назначенный переменной pc. Экземпляры класса Character имеют атрибут под названием name, изначально установленный на «DEFAULT», но будет обновляться на основе ввода пользователем при начальной настройке новой игры. Для экс:

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

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

У меня тоже есть (или будет иметь) большое количество функций, которые относятся к различным инстанциям, используя переменные они asigned в. Например, составлен один в качестве упрощенного примера может быть:

def print_name(character): 
    print character.name 

def run(): 
    print_name(pc) 

run() 

Я планирую иметь функцию сохранения, которая будет упаковать экземпляр ПК (среди другой информации) с их текущей информацией (например: с обновленным имя). У меня также будет функция загрузки, которая позволит пользователю играть в сохраненную игру, а не запускать новую. Из того, что я прочитал, нагрузка может работать что-то вроде этого:

*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"] 

Мой вопрос, есть ли способ для загрузки сукно «запоминать» имя переменной assotiated с экземпляром, и автоматически делать < < pc = mysave ["pc"] >> step? Или способ сохранить это имя переменной как строку (например, как ключ) и каким-то образом использовать эту строку для создания переменной с правильным именем (pc)?

Мне нужно «сэкономить» много экземпляров и может автоматизировать этот процесс с помощью цикла, но я не знаю, как автоматизировать разгрузку для определенных имен переменных. Действительно ли я должен повторно назначать каждого отдельно и явно? Мне нужно назначить экземпляры обратно к соответствующим именам переменных bc. У меня есть куча основных функций, которые относятся к конкретным экземплярам с именами переменных (например, пример, приведенный выше).

Идеи? Возможно ли это, или есть совершенно другое решение, которое я не вижу?

Спасибо!

~ ребра

+0

Ну, очевидное решение не имеет так много переменных, толкает большинство данных в структуры данных, на которые ссылаются некоторые переменные. – delnan

+0

Достаточно честный. Я попробую провести реструктуризацию, поэтому у меня есть более общие переменные, ссылающиеся на ... словари, содержащие различные экземпляры. (Вот почему я хотел получить основную структуру до инвестирования времени в создание персонажа/комнаты/etc). - Я полагаю, по вашему мнению, что сохранение переменных невозможно или не рекомендуется/не лучшее решение? – ribs

+0

Есть очень мало вещей, которые невозможны, но такого рода вещи обычно нецелесообразны. Причины отчасти догматы, отчасти страх перед возможными (но не гарантированными) последствиями, а отчасти это почти всегда лучший способ. – delnan

ответ

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() 
+0

Спасибо, Мартино! Я никогда не изучал функциональность globals() раньше. Так как я так новичок в программировании любого типа (просто по-настоящему возиться), мне хорошо видеть, что можно сделать и как (даже если я возьму совет Дельнана и исследую реструктуризацию своих переменных, прежде чем я начну перебирать глобалы). – ribs

+0

@ribs: Да, такой подход, на который смотрят многие, хотя и возможно, зависит от того, как работает Python. Лучше всего было бы хранить все экземпляры 'Character' в каком-то другом объекте контейнера, например,' list' или 'dict', и не пытаться назначать разные имена переменных для каждого из них. Таким образом, сохранение их всех становится относительно простым вопросом просто сохранения контейнера. – martineau

Смежные вопросы