Guest User

Untitled

a guest
Jan 17th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.12 KB | None | 0 0
  1. import functools, inspect
  2.  
  3.  
  4. def proper_cache(*lru_args, **lru_kwargs):
  5. def deco(func):
  6. signature = inspect.signature(func)
  7.  
  8. # if the function has no default parameters, return a normal lru_cache
  9. if all(p.default is inspect.Parameter.empty for p in signature.parameters.values()):
  10. return functools.lru_cache(*lru_args, **lru_kwargs)(func)
  11.  
  12. # apply an lru_cache on the original function
  13. func = functools.lru_cache(*lru_args, **lru_kwargs)(func)
  14.  
  15. # return a function that expands all default arguments
  16. @functools.wraps(func)
  17. def wrapper_func(*args, **kwargs):
  18. bound_args = signature.bind(*args, **kwargs)
  19. bound_args.apply_defaults()
  20. return func(*bound_args.args, **bound_args.kwargs)
  21.  
  22. wrapper_func.cache_info = func.cache_info
  23. wrapper_func.cache_clear = func.cache_clear
  24.  
  25. return wrapper_func
  26.  
  27. return deco
  28.  
  29.  
  30.  
  31. @proper_cache()
  32. def func(arg=1):
  33. return arg
  34.  
  35. func()
  36. func(1)
  37.  
  38. print(func.cache_info()) # CacheInfo(hits=1, misses=1, maxsize=128, currsize=2)
Add Comment
Please, Sign In to add comment