Creating a callable param (hash_params) to generate key when positional and/or keywords arguments are not hashable.

It can work as a workaround in scenarios that positional and keywords args are not hashable but one can be generated with a properly method for each case
This commit is contained in:
Alison Marczewski
2020-03-08 16:58:07 -03:00
parent 012fe46cb1
commit e99933b520
4 changed files with 12 additions and 6 deletions
+1 -1
View File
@@ -28,7 +28,7 @@ class _BaseCore():
if such a mapping exists."""
@abc.abstractmethod
def get_entry(self, args, kwds):
def get_entry(self, args, kwds, hash_params):
"""Returns the result mapped to the given arguments in this core's
cache, if such a mapping exists."""
+7 -1
View File
@@ -79,6 +79,7 @@ def cachier(
pickle_reload=True,
mongetter=None,
cache_dir=None,
hash_params=None,
):
"""A persistent, stale-free memoization decorator.
@@ -112,6 +113,11 @@ def cachier(
A fully qualified path to a file directory to be used for cache files.
The running process must have running permissions to this folder. If
not provided, a default directory at `~/.cachier/` is used.
hash_params : callable, optional
A callable that takes args and kwargs from main function and returns
a hash key of these params. If unset, default transformation is
applied. It is valuable and works as workaround in scenarios
that positional and keyword arguments are not hashable.
"""
# print('Inside the wrapper maker')
# print('mongetter={}'.format(mongetter))
@@ -142,7 +148,7 @@ def cachier(
_print = print
if ignore_cache:
return func(*args, **kwds)
key, entry = core.get_entry(args, kwds)
key, entry = core.get_entry(args, kwds, hash_params)
if overwrite_cache:
return _calc_entry(core, key, func, args, kwds)
if entry is not None: # pylint: disable=R0101
+2 -2
View File
@@ -79,8 +79,8 @@ class _MongoCore(_BaseCore):
return key, entry
return key, None
def get_entry(self, args, kwds):
key = pickle.dumps(args + tuple(sorted(kwds.items())))
def get_entry(self, args, kwds, hash_params):
key = pickle.dumps(args + tuple(sorted(kwds.items())) if hash_params is None else hash_params(args, kwds))
return self.get_entry_by_key(key)
def set_entry(self, key, func_res):
+2 -2
View File
@@ -146,8 +146,8 @@ class _PickleCore(_BaseCore):
self._reload_cache()
return key, self._get_cache().get(key, None)
def get_entry(self, args, kwds):
key = args + tuple(sorted(kwds.items()))
def get_entry(self, args, kwds, hash_params):
key = args + tuple(sorted(kwds.items())) if hash_params is None else hash_params(args, kwds)
# print('key type={}, key={}'.format(type(key), key))
return self.get_entry_by_key(key)