mirror of
https://github.com/wassname/cachier.git
synced 2026-09-09 11:19:08 +08:00
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:
@@ -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
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user