Thin Python Cache Decorator

def cache(func):
""" A thin middleware that caches based on function name and arguments. """
    def _inner(*args, **kwargs):
        a_str = "&".join([str(a) or None for a in args])
        kw_str = "&".join(["%s=%s" for key, val in kwargs.iteritems()])
        key_name = slugify("%s:%s:%s" % (func.__name__, a_str, kw_str))
        cached = cache.get(key_name)
        if not cached:
            cached = func(*args, **kwargs)
            cache.set(key_name, cached)
        return cached
    return _inner

This is designed with django in mind, but you can replace cache.set and cache.get with any cache cache framework of your choice. Also, I use slugify because many cache frameworks don’t like spaces in cache key names. Slugify replaces them with dashes.

Usage is simple:

@cache
def expensive_method(a,b=True):
    ...
This entry was posted in Uncategorized. Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.