|
|
- import random
-
- from .cache import Cache
-
-
- # random.choice cannot be pickled in Python 2.7
- def _choice(seq):
- return random.choice(seq)
-
-
- class RRCache(Cache):
- """Random Replacement (RR) cache implementation."""
-
- def __init__(self, maxsize, choice=random.choice, getsizeof=None):
- Cache.__init__(self, maxsize, getsizeof)
- # TODO: use None as default, assing to self.choice directly?
- if choice is random.choice:
- self.__choice = _choice
- else:
- self.__choice = choice
-
- @property
- def choice(self):
- """The `choice` function used by the cache."""
- return self.__choice
-
- def popitem(self):
- """Remove and return a random `(key, value)` pair."""
- try:
- key = self.__choice(list(self))
- except IndexError:
- msg = '%s is empty' % self.__class__.__name__
- raise KeyError(msg) from None
- else:
- return (key, self.pop(key))
|