Source code for arxiv.canonical.register.util
import collections
from uuid import uuid4
from typing import Callable, MutableMapping, Any, Dict, Iterator, List, \
Sequence
[docs]class LazyMapView(collections.abc.MutableMapping):
def __init__(self, mapping: MutableMapping[Any, Any],
getter: Callable[[Any], Any]) -> None:
self._mapping = mapping
self._getter = getter
def __len__(self) -> int:
return len(self._mapping)
def __getitem__(self, key: Any) -> Any:
return self._getter(self._mapping[key])
def __iter__(self) -> Iterator[Any]:
return iter(self._mapping)
def __delitem__(self, key: Any) -> None:
raise NotImplementedError('Deletion is not allowed')
def __setitem__(self, key: Any, value: Any) -> None:
raise NotImplementedError('not yet')
[docs]class LazyMap(collections.abc.MutableMapping):
def __init__(self, keys: List[Any], load: Callable[[Any], Any],
strict: bool = False) -> None:
self._keys = keys
self._load = load
self._data: Dict[Any, Any] = {}
self._strict = strict
def __getitem__(self, key: Any) -> Any:
if self._strict and key not in self._keys:
raise KeyError(f'No such key: {key}')
try:
if key not in self._data:
self._data[key] = self._load(key)
return self._data[key]
except Exception as e:
raise KeyError(f'{key} not found or not supported') from e
def __len__(self) -> int:
return len(self._keys)
def __iter__(self) -> Iterator[Any]:
return iter(self._keys)
def __contains__(self, key: Any) -> bool:
return bool(key in self._keys)
def __delitem__(self, key: Any) -> None:
raise NotImplementedError('Deletion is not allowed')
def __setitem__(self, key: Any, value: Any) -> None:
self._data[key] = value
self._keys.append(key)