def __init__(self, fn): self._callable = fn self.in_call = False def __call__(self, *args, **kwds): if self.in_call: raise RuntimeError('Identified recursion!') self.in_call = True try: result = self._callable(*args, **kwds) finally: self.in_call = False return result protect_against_recursion = simple_decorator(ProtectAgainstRecursion) class Memoize(object): def __init__(self,function): self._callable = function self.set_cache_enabled(True) self.logging_level = None def set_cache_enabled(self, value): self._cache_enabled = value def has_cached_value(self): try:
logging.basicConfig(level=logging.INFO) class Memoize(object): def __init__(self,function): self._callable = function def __call__(self): try: return self.cached_value except AttributeError: self.cached_value = self._callable() return self.cached_value memoize = simple_decorator(Memoize) class Klass(object): def __init__(self): self._calculate_value = memoize(self._calculate_value) def _calculate_value(self): logging.info('id=%d: Calculating value', id(self)) return 5 * 3 def _get_value(self): return self._calculate_value()