@RimmaKur
Вроде человек

Как реализовать settings.py?

Нужно для программы создать файл настроек.
1 вопрос:
как сделать так, чтобы если файл существует, правильно его прочитать?
а если его нет, то создать?

2 вопрос: как реализовать чтение/заполнение файлов?
Я представляю так: при открытии программы создается файл (если его нет) settings.py, и в него записываются стандартные настройки типа таких:
# settings
window_theme = 'DarkBlue10'
checkbox1 = True
checkbox2 = False
# и.т.д


а если есть, то читается.
Если пользователь решил изменить настройки, то надо поменять значения. вопрос: как?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Vindicar
@Vindicar
Я для таких вещей люблю использовать 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)  # выводим сообщение об ошибке
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы