Make @lru_cache ignore some of the function arguments
With cachetools you can write:
from cachetools import cachedfrom cachetools.keys import hashkeyfrom random import randint@cached(cache={}, key=lambda db_handle, query: hashkey(query))def find_object(db_handle, query): print("processing {0}".format(query)) return queryqueries = list(range(5))queries.extend(range(5))for q in queries: print("result: {0}".format(find_object(randint(0, 1000), q)))
I have at least one very ugly solution. Wrap db_handle
in a object that's always equals, and unwrap it inside the function.
It requires a decorator with quite a bit of helper functions, which makes stack trace quite confusing.
class _Equals(object): def __init__(self, o): self.obj = o def __eq__(self, other): return True def __hash__(self): return 0def lru_cache_ignoring_first_argument(*args, **kwargs): lru_decorator = functools.lru_cache(*args, **kwargs) def decorator(f): @lru_decorator def helper(arg1, *args, **kwargs): arg1 = arg1.obj return f(arg1, *args, **kwargs) @functools.wraps(f) def function(arg1, *args, **kwargs): arg1 = _Equals(arg1) return helper(arg1, *args, **kwargs) return function return decorator