import json import atexit from dataclasses import dataclass, asdict, fields from typing import Any, Dict from pathlib import Path @dataclass class Config: filename: str autosave: bool = False def __post_init__(self): # Загружаем значения из файла при создании экземпляра self.load() # Регистрируем автоматическое сохранение при завершении программы if self.autosave: atexit.register(self.save) def load(self) -> None: """Загружает значения полей из файла""" try: if Path(self.filename).exists(): with open(self.filename, 'r') as f: data = json.load(f) for field in fields(self): if field.name in data and field.name != 'filename': setattr(self, field.name, data[field.name]) except Exception as e: print(f"Error loading config: {e}") def save(self) -> None: """Сохраняет текущие значения полей в файл""" try: # Преобразуем объект в словарь, исключая поле filename data = asdict(self) data.pop('filename', None) # Создаем директорию, если она не существует Path(self.filename).parent.mkdir(parents=True, exist_ok=True) # Сохраняем в файл с кастомным сериализатором для Path объектов with open(self.filename, 'w') as f: json.dump(data, f, indent=4, default=self._json_serializer) except Exception as e: print(f"Error saving config: {e}") def _json_serializer(self, obj: Any) -> Any: """Кастомный сериализатор для объектов, которые не могут быть сериализованы по умолчанию""" if isinstance(obj, Path): return str(obj) raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable")