Lasse Vågsæther Karlsen wrote: > Sam Pointon wrote: > >> What about not storing args at all? Something like this: <snip>
Ok, here's my updated version: class cache(object): def __init__(self, timeout=0): self.timeout = timeout self.cache = {} def __call__(self, fn): arg_names = inspect.getargspec(fn)[0] def cached_result(*args, **kwargs): # Update named arguments with positional argument values kwargs.update(dict(zip(arg_names, args))) # Work out key as a tuple of ('argname', value) pairs key = tuple(sorted(kwargs.items())) # Check cache and return cached value if possible if key in self.cache: (value, last_time) = self.cache[key] if self.timeout <= 0 or time.time() - last_time <= self.timeout: return value # Work out new value, cache it and return it result = fn(**kwargs) self.cache[key] = (result, time.time()) return result # Return wrapper function return cached_result Changed from previous versions: - converted to class, must use () on decorator now - added timeout, results will be recalculated when it expires - timeout=0 means no timeout, results will always be reused - now handles both positional and keyword arguments -- Lasse Vågsæther Karlsen http://usinglvkblog.blogspot.com/ mailto:[EMAIL PROTECTED] PGP KeyID: 0x2A42A1C2 -- http://mail.python.org/mailman/listinfo/python-list