Skip to content

Instantly share code, notes, and snippets.

@ccorcos
Created April 16, 2014 01:53
Show Gist options
  • Save ccorcos/10797394 to your computer and use it in GitHub Desktop.
Save ccorcos/10797394 to your computer and use it in GitHub Desktop.
memoize class for memorizing / caching function calls in python along with reset and reset all memoized functions
import collections
import functools
memoized = []
def clearAllMemoized():
[m.reset() for m in memoized]
class memoize(object):
'''Decorator. Caches a function's return value each time it is called.
If called later with the same arguments, the cached value is returned
(not reevaluated).
'''
def __init__(self, func):
self.func = func
self.cache = {}
memoized.append(self)
def __call__(self, *args):
if not isinstance(args, collections.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 functools.partial(self.__call__, obj)
def reset(self):
self.cache = {}
@jmb0z
Copy link

jmb0z commented Oct 22, 2016

wrong, since isinstance(args, collections.Hashable) will always be True

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment