You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.0 KiB
Python
38 lines
1.0 KiB
Python
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()
|