Возможно ли как-то в данном случае поменять переменную?

Рейтинг: 1Ответов: 1Опубликовано: 24.02.2023

В одном файле у меня вызывается функция из списка, в другом находятся сами функции, в третьем словарь в формате json со значениями переменных. Возможно ли как-то менять эти значения с помощью функций, вызываемых из второго файла?

В первом файле:

from json import *
from functions import *

with open('save.json') as save:
    save = load(save)
    name = save['name']     #имя игрока
    hp = save['hp']         #очки здоровья
    ap = save['ap']         #очки силы
    money = save['money']   #деньги
    mana = save['mana']     #очки маны

func_list = {'help':help,                                   #список команд
         '?':help,
         'status':status,
         'inventory':inventory,
         'hurt': hurt}

while True:
    enter = input('/')
    func_list[enter]()

Во втором файле (functions.py):

from json import *

def help():
    #печатается помощь

def status():
    #печатаются переменные

def inventory():
    #показывается инвентарь

def hurt():
    #значение переменной hp меняется на -1. Как раз то, что я не понимаю, как сделать.

Ну и третий файл с переменными (save.json):

{"name": "", 
 "hp": 0, 
 "ap": 0, 
 "money": 0, 
 "mana": 0}

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

Ответы

▲ 0

В общем, я решил проблему так:

Первый файл:

from funcs import *
from time import *


changes()                               #в json теперь изначальные значения (необязательно)

print('hp до:', save_dict['hp'])        #hp до: 0

sleep(3)

hp_change()                             #функция поменяла значения в словаре

print('hp после:', save_dict['hp'])     #hp после: 1

changes()                               #новые значения сохранены в json

Второй файл (funcs):

from json import *

name = 'aaaa'
hp = 0
listik = []
        
save_dict = {'name':name,
            'hp':hp,
            'listik':listik}


def changes():
    with open('save_test.json', 'w') as save:
        dump(save_dict,save,indent=4)


def hp_change():
    global save_dict
    save_dict['hp'] += 1

Файл json с переменными:

{
    "name": "aaaa",
    "hp": 0,
    "listik": []
}

Вкратце, я создал словарь с переменными (save_dict) и функцию, которая переписывает json, вставляя вместо тамошних значений этот словарь. Также создал функцию, которая меняет нужное значение внутри словаря. Что удобно, мне не нужно в первом файле указывать, какую именно переменную нужно поменять, то есть теперь можно вызывать разные функции, в том числе через цикл или даже input(). Типа, как-то так:

Первый файл:

from funcs import *
from time import *


functions = {'name_change':name_change,
            'hp_change':hp_change,
            'listik_change':listik_change}

changes()                                   #начальные данные

print('name до:', save_dict['name'])        #aaaa
print('hp до:', save_dict['hp'])            #0
print('listik до:', save_dict['listik'])    #[]

sleep(3)
print()

for change_sth in functions.values():
    change_sth()                            #данные меняются

print('name после:', save_dict['name'])     #bbbb
print('hp после:', save_dict['hp'])         #1
print('listik после:', save_dict['listik']) #[0, 1, 2, 3]

changes()                                   #данные сохранены в json

Второй файл:

from json import *

name = 'aaaa'
hp = 0
listik = []
        
save_dict = {'name':name,
            'hp':hp,
            'listik':listik}


def changes():
    with open('save_test.json', 'w') as save:
        dump(save_dict,save,indent=4)


def name_change():
    global save_dict
    save_dict['name'] = 'bbbb'

def hp_change():
    global save_dict
    save_dict['hp'] += 1

def listik_change():
    global save_dict
    save_dict['listik'] += [0,1,2,3]

json со значениями до вызова функций:

{
    "name": "aaaa",
    "hp": 0,
    "listik": []
}

json со значениями после вызова функций:

{
    "name": "bbbb",
    "hp": 1,
    "listik": [
        0,
        1,
        2,
        3
    ]
}

Таким вот образом я сделал в своей игре сохранения. Один нюанс - у нас нет переменных name, hp и listik как таковых. Вернее, они есть, но всегда равны начальным значениям. То есть, по нулям. Это легко правится, но нам надо либо в цикле постоянно заменять их значения на соответствующие значения из словаря, либо просто сразу обращаться к нужному значению в словаре, что удобней на мой вкус. Пояснение:

Вот так не сработает: print('hp после:', hp)

А вот так работает как надо: print('hp после:', save_dict['hp'])

Я пробовал указывать в функции изменения, что глобальная переменная меняется на значение этой переменной в save_dict, но работает это как-то странно. Меняется только список. В моём случае, после изменения значений в словаре меняется только переменная listik, остальные так и остаются начальными.