Source code for tagit.external.memoize
"""Memoize decorator
From:
https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
Usage:
>>> @memoized
>>> def fibonacci(n):
>>> "Return the nth fibonacci number."
>>> if n in (0, 1):
>>> return n
>>> return fibonacci(n-1) + fibonacci(n-2)
>>>
>>> print fibonacci(12)
>>>
Part of the tagit module.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2016
"""
__all__ = ('memoized', )
import collections
import functools
[docs]class memoized(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 = {}
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)
## EOF ##