Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import functools, inspect
- def proper_cache(*lru_args, **lru_kwargs):
- def deco(func):
- signature = inspect.signature(func)
- # if the function has no default parameters, return a normal lru_cache
- if all(p.default is inspect.Parameter.empty for p in signature.parameters.values()):
- return functools.lru_cache(*lru_args, **lru_kwargs)(func)
- # apply an lru_cache on the original function
- func = functools.lru_cache(*lru_args, **lru_kwargs)(func)
- # return a function that expands all default arguments
- @functools.wraps(func)
- def wrapper_func(*args, **kwargs):
- bound_args = signature.bind(*args, **kwargs)
- bound_args.apply_defaults()
- return func(*bound_args.args, **bound_args.kwargs)
- wrapper_func.cache_info = func.cache_info
- wrapper_func.cache_clear = func.cache_clear
- return wrapper_func
- return deco
- @proper_cache()
- def func(arg=1):
- return arg
- func()
- func(1)
- print(func.cache_info()) # CacheInfo(hits=1, misses=1, maxsize=128, currsize=2)
Add Comment
Please, Sign In to add comment