from __future__ import annotations import time from dataclasses import dataclass from typing import Any @dataclass class CacheItem: value: Any expires_at: float | None class CacheManager: def __init__(self, *, default_timeout: int = 300) -> None: self.default_timeout = default_timeout self._items: dict[str, CacheItem] = {} def get(self, key: str) -> Any: item = self._items.get(key) if item is None: return None if item.expires_at is not None and item.expires_at < time.time(): self._items.pop(key, None) return None return item.value def set(self, key: str, value: Any, timeout: int | None = None) -> None: timeout = self.default_timeout if timeout is None else timeout expires_at = None if timeout <= 0 else time.time() + timeout self._items[key] = CacheItem(value=value, expires_at=expires_at) def delete(self, key: str) -> None: self._items.pop(key, None) def clear(self) -> None: self._items.clear()