Source code for pybs.utils.miscellaneous

# This Python file uses the following encoding: utf-8
from collections import \
    Hashable as _Hashable
from functools import partial as _partial, wraps


# Copied from https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
[docs]class memoized(object): '''Decorator. Caches a function's return value. If called later with the same arguments, the cached value is returned (not reevaluated). ''' def __init__(self, func): self.func = func self.cache = {} # weakref.WeakKeyDictionary() def __call__(self, *args): if not isinstance(args, _Hashable): # uncacheable. a list, for instance. # better to not cache than blow up. return self.func(*args) if args in self.cache: return self.cache[args] else: value = self.func(*args) self.cache[args] = value return value def __repr__(self): '''Return the function's docstring.''' return self.func.__doc__ def __get__(self, obj, objtype): '''Support instance methods.''' return _partial(self.__call__, obj)
[docs]def memoized2(func): """Slightly different memoization. Does not confuse autodoc the way other decorators do. """ @wraps(func) def wrapper(*args): if args in wrapper.cache: return wrapper.cache[args] else: value = func(*args) wrapper.cache[args] = value return value wrapper.cache = {} return wrapper