def Cache(func): class CacheCls(object): def __init__(self, func): if func.func_code.co_argcount > 0: self.values = {} else: self.values = None self.cached = False self.value = None self.func = func def __call__(self, *args, **kwargs): if self.values == None: if not self.cached: self.value = self.func() self.cached = True return self.value key = `(args, kwargs)` try: return self.values[key] except KeyError: pass value = self.values[key] = self.func(*args, **kwargs) return value return CacheCls(func)