Я для таких вещей люблю использовать JSON и датаклассы. Хорошо работает, если у тебя в настройках только простые типы (целое число, дробное число, строка, булево значение), из коллекций - списки.
Описываешь настройки как датакласс
import dataclasses
@dataclasses.dataclass
class Settings:
x: int = 0 # имя, тип настройки, значение по умолчанию
y: int = 0
name: str = "Безымянный"
Тогда загрузку из файла можно сделать так:
import sys
import pathlib
import json
# я предполагаю, что ты будешь хранить настройки в каталоге скрипта
APP_DIR = pathlib.Path(sys.argv[0]).parent.resolve() # путь к каталогу скрипта
CFG = APP_DIR / 'settings.json' # путь к файлу конфига
settings = Settings() # создаём настройки по умолчанию
try:
with CFG.open('rt', encoding='utf-8') as cfg: # открываем файл (закроется сам по выходу из with)
data = json.load(cfg) # разбираем файл как JSON
settings = dataclasses.replace(settings, **data) # обновляем настройки значениями из файла
except Exception as err:
print('Ошибка загрузки настроек:', err) # выводим сообщение об ошибке
# но выполнение кода продолжается в любом случае
# у нас есть либо settings с значениями по умолчанию, либо settings, обновлённый из файла
print(settings.name, settings.x, settings.y) # пример использования объекта settings
settings.name = 'Имя' # значения в объекте можно менять
settings.x, settings.y = 10, 20
Для сохранения можно будет аналогично вытащить значения всех полей из объекта:
try:
data = dataclasses.asdict(settings) # превращаем объект в словарь
with CFG.open('wt', encoding='utf-8') as cfg: # открываем файл (закроется сам по выходу из with)
json.dump(data, cfg, ensure_ascii=False, indent=' ') # записываем словарь в файл в формате JSON
except Exception as err:
print('Ошибка сохранения настроек:', err) # выводим сообщение об ошибке