import os, json from src.settings import settings class settings_manager (object): # Объект настроек __settings = None # Путь до файла настроек __filename = "settings.json" # Словарь со считанными данными __data = {} # Возвращаем существующий инстанс при вызове new() (singleton) def __new__(cls): if not hasattr(cls, "instance"): cls.instance = super(settings_manager, cls).__new__(cls) return cls.instance @property def data(self): return self.__data @property def settings(self): return self.__settings def __convert(self): """ Заполнить объект настроек Raises: Exception: Невозможно создать экземпляр класса настроек """ # Создаем инстанс settings, если он еще не создан if not self.__settings: self.__settings = settings() # Выбрасываем ошибку, если тип __settings не соответствует нужному if not isinstance(self.__settings, settings): raise Exception("Невозможно создать экземпляр класса настроек") # Переносим считанные значения в инстанс настроек for key in self.__data.keys(): # Пропускаем, если у settings нет соответствующего свойства if not hasattr(self.__settings, key): continue setattr(self.__settings, key, self.__data[key]) def open(self, filename): """ Открыть файл с настройками Args: filename: Имя файла Raises: TypeError: Неверный тип аргумента ValueError: Неверная длина аргумента """ # Проверяем, чтобы путь был строкой if not isinstance(filename, str): raise TypeError("Неверный тип аргумента") # Проверяем, чтобы путь не был пуст if len(filename) == 0: raise ValueError("Неверная длина аргумента") # Убираем leading/trailing пробелы self.__filename = filename.strip() return self.__open() def __open(self): """ Открыть файл с настройками Raises: FileNotFoundError: Ошибка при открытии файла """ settings_file = self.__filename # Проверяем, существует ли файл по данному пути if not os.path.exists(settings_file): raise FileNotFoundError("Невозможно загрузить файл настроек") # Открываем файл и парсим JSON with open(settings_file, "r", encoding="UTF-8") as read_file: self.__data = json.load(read_file) # Заполняем объект settings прочитанными значениями self.__convert() return True