def Cache(fn):
 def fnCache(*args, **kwargs):
  ' Cache function '
  key = (((args and tuple(args)) or None), ((kwargs and frozenset(kwargs.items())) or None))
  if (key not in fn.__cached__):
   fn.__cached__[key] = cache = fn(*args, **kwargs)
  else:
   cache = fn.__cached__[key]
  return cache
 def ResetCache():
  ' Reset cache '
  fn.__cached__ = {}
 setattr(fn, '__cached__', {})
 setattr(fn, '__resetcache__', ResetCache)
 fnCache.__name__ = fn.__name__
 fnCache.__doc__ = fn.__doc__
 fnCache.__dict__.update(fn.__dict__)
 return fnCache

def Cache ( fn ) : def fnCache ( * args , ** kwargs ) : key = ( ( ( args and tuple ( args ) ) or None ) , ( ( kwargs and frozenset ( kwargs . items ( ) ) ) or None ) ) if ( key not in fn . __cached__ ) : fn . __cached__ [ key ] = cache = fn ( * args , ** kwargs ) else : cache = fn . __cached__ [ key ] return cache def ResetCache ( ) : fn . __cached__ = { } setattr ( fn , '__cached__' , { } ) setattr ( fn , '__resetcache__' , ResetCache ) fnCache . __name__ = fn . __name__ fnCache . __doc__ = fn . __doc__ fnCache . __dict__ . update ( fn . __dict__ ) return fnCache
function cache decorator .