Untitled
unknown
plain_text
2 years ago
2.5 kB
22
Indexable
import abc
from typing import Any, Dict, Optional
class BaseStorage(abc.ABC):
"""Абстрактное хранилище состояния.
Позволяет сохранять и получать состояние.
Способ хранения состояния может варьироваться в зависимости
от итоговой реализации. Например, можно хранить информацию
в базе данных или в распределённом файловом хранилище.
"""
@abc.abstractmethod
def save_state(self, state: Dict[str, Any]) -> None:
"""Сохранить состояние в хранилище."""
@abc.abstractmethod
def retrieve_state(self) -> Dict[str, Any]:
"""Получить состояние из хранилища."""
class JsonFileStorage(BaseStorage):
"""Реализация хранилища, использующего локальный файл.
Формат хранения: JSON
"""
def __init__(self, file_path: Optional[str] = None) -> None:
self.file_path = file_path
def save_state(self, state: Dict[str, Any]) -> None:
"""Сохранить состояние в хранилище."""
if self.file_path is None:
return
with open(self.file_path, 'w') as f:
json.dump(state, f)
# TODO: реализовать
def retrieve_state(self) -> Dict[str, Any]:
"""Получить состояние из хранилища."""
# TODO: реализовать
if self.file_path is None:
return {}
try:
with open(self.file_path, 'r') as f:
data = json.load(f)
return data
except FileNotFoundError:
self.save_state({})
class State:
"""Класс для работы с состояниями."""
def __init__(self, storage: BaseStorage):
self.storage = storage
def set_state(self, key: str, value: Any) -> None:
"""Установить состояние для определённого ключа"""
self.storage.save_state({key: value})
def get_state(self, key: str) -> Any:
"""Получить состояние по определённому ключу"""
return self.storage.retrieve_state().get(key)
Editor is loading...