Python3 pass lists to function with functools.lru_cache
It should not throw an error, rather convert into hash-able form within decorator without user even knowing it. You can fix this problem by decorating your functions like this:
#Custom Decorator function
def listToTuple(function):
def wrapper(*args):
args = [tuple(x) if type(x) == list else x for x in args]
result = function(*args)
result = tuple(result) if type(result) == list else result
return result
return wrapper
#your cached function
@listToTuple
@lru_cache(maxsize=cacheMaxSize)
def checkIfAdminAcquired(self, adminId) -> list:
query = "SELECT id FROM public.admins WHERE id IN ({}) and
confirmed_at IS NOT NULL"
response = self.handleQuery(query, "int", adminId)
return response
You might want to use yet another decorator after lru_cache to make sure that output of the function is not a tuple, but a list, since right now it will return tuple.
This fails because a list is unhashable. This would make it hard for Python to know what values are cached. A way to fix this is by converting lists to tuples before passing them to a cached function: since tuples are immutable and hashable, they can be cached.
TL;DR
Use a tuple instead of a list:
>>> @lru_cache(maxsize=2)
... def my_function(args):
... pass
...
>>> my_function([1,2,3])
Traceback (most recent call last):
File "<input>", line 1, in <module>
my_function([1,2,3])
TypeError: unhashable type: 'list'
>>> # TO FIX: use a tuple
>>> my_function(tuple([1,2,3]))
>>>