From 5068bb47b37d43e5c57bbcc397d63f08a3729379 Mon Sep 17 00:00:00 2001 From: jsdio Date: Mon, 5 Jun 2023 14:31:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D0=BD=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- state.py | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 state.py diff --git a/state.py b/state.py new file mode 100644 index 0000000..02486d6 --- /dev/null +++ b/state.py @@ -0,0 +1,65 @@ +import abc +from typing import Any, Dict +import json +import os + + +class BaseStorage(abc.ABC): + """Абстрактное хранилище состояния. + + Позволяет сохранять и получать состояние. + """ + + @abc.abstractmethod + def save_state(self, state: Dict[str, Any]) -> None: + """Сохранить состояние в хранилище.""" + raise NotImplementedError + + @abc.abstractmethod + def retrieve_state(self) -> Dict[str, Any]: + """Получить состояние из хранилища.""" + raise NotImplementedError + + +class JsonFileStorage(BaseStorage): + """Реализация хранилища, использующего локальный файл. + + Формат хранения: JSON + """ + + def __init__(self, file_path: str = 'state.json') -> None: + self.file_path = file_path + try: + with open(file_path, 'r', encoding='UTF-8') as f: + self.local_storage = json.load(f) + except FileNotFoundError: + self.local_storage = {} + + def save_state(self, state: Dict[str, Any]) -> None: + """Сохранить состояние в хранилище.""" + with open(self.file_path, 'w+', encoding='UTF-8') as f: + json.dump(state, f, ensure_ascii=False) + + def retrieve_state(self) -> Dict[str, Any]: + """Получить состояние из хранилища.""" + if not os.path.exists(self.file_path): + return {} + + with open(self.file_path, 'r') as file: + return json.load(file) + + +class State: + """Класс для работы с состояниями.""" + + def __init__(self, storage: BaseStorage) -> None: + self.storage = storage + self.local_state = storage.retrieve_state() + + def set_state(self, key: str, value: Any) -> None: + """Установить состояние для определённого ключа.""" + self.local_state[key] = value + + def get_state(self, key: str) -> Any: + """Получить состояние по определённому ключу.""" + return self.local_state.get(key) \ No newline at end of file