Skip to content

Instantly share code, notes, and snippets.

@harel
Last active December 5, 2018 02:11
Show Gist options
  • Save harel/9ced5ed51b97a084dec71b9595565a71 to your computer and use it in GitHub Desktop.
Save harel/9ced5ed51b97a084dec71b9595565a71 to your computer and use it in GitHub Desktop.
Decorator for using dicts/lists with python LRU Cache
def hashable_lru(func):
cache = lru_cache(maxsize=1024)
def deserialise(value):
try:
return json.loads(value)
except Exception:
return value
def func_with_serialized_params(*args, **kwargs):
_args = tuple([deserialise(arg) for arg in args])
_kwargs = {k: deserialise(v) for k, v in kwargs.items()}
return func(*_args, **_kwargs)
cached_function = cache(func_with_serialized_params)
@wraps(func)
def lru_decorator(*args, **kwargs):
_args = tuple([json.dumps(arg, sort_keys=True) if type(arg) in (list, dict) else arg for arg in args])
_kwargs = {k: json.dumps(v, sort_keys=True) if type(v) in (list, dict) else v for k, v in kwargs.items()}
return cached_function(*_args, **_kwargs)
lru_decorator.cache_info = cached_function.cache_info
lru_decorator.cache_clear = cached_function.cache_clear
return lru_decorator
@adah1972
Copy link

adah1972 commented Dec 5, 2018

Inspired by your idea, I created a more generic version:

https://gist.github.com/adah1972/f4ec69522281aaeacdba65dbee53fade

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment