import functools import os class cached_property(object): """Like @property, but caches the value.""" def __init__(self, func): self.__name__ = func.__name__ self.__module__ = func.__module__ self.__doc__ = func.__doc__ self._func = func def __get__(self, obj, cls): if obj is None: return self value = self._func(obj) obj.__dict__[self.__name__] = value return value def memoize_by_cwd(func): """Memoize a function call based on os.getcwd().""" @functools.wraps(func) def wrapper(*args): cwd = os.getcwd() key = (cwd,) + args try: return wrapper._cache[key] except KeyError: ret = wrapper._cache[key] = func(*args) return ret wrapper._cache = {} return wrapper