В общем, я решил проблему так:
Первый файл:
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, остальные так и остаются начальными.