#!/usr/bin/env python3 import pickle from typing import Any, Mapping import file_utils class PersistentState(object): """ An object that behaves like a persistent hash map; it can be accessed to store key-value pairs but also saved to disk and read back from disk easily. """ def __init__(self, filename: str, *, max_age_sec: int = None): self.filename = filename if file_utils.does_file_exist(self.filename): if max_age_sec is not None: age = file_utils.get_file_mtime_age_seconds(self.filename) if age < max_age_sec: self.state = self.load() else: self.state = {} else: self.state = self.load() else: self.state = {} def __getitem__(self, key: str) -> Any: return self.state.get(key, "") def __setitem__(self, key: str, value: Any): self.state[key] = value def __delitem__(self, key: str): del self.state[key] def __iter__(self): return iter(self.state) def __len__(self): return len(self.state) def save(self) -> None: with open(self.filename, 'wb') as f: pickle.dump(self.state, f, pickle.HIGHEST_PROTOCOL) def load(self) -> Mapping[str, Any]: with open(self.filename, 'rb') as f: return(pickle.load(f))