🚧 api: building redis cache decorator
This commit is contained in:
parent
21defd1e3d
commit
3a64668d89
1 changed files with 19 additions and 21 deletions
|
|
@ -74,30 +74,25 @@ def args_slice(func: Callable[P, R], *args: Iterable) -> tuple:
|
|||
return tuple(*args)
|
||||
|
||||
|
||||
def cache_key(func: Callable[P, R], *args: P.args, **kwargs: P.kwargs) -> str:
|
||||
"""Return a cache key for use with cached methods."""
|
||||
|
||||
kwargs_by_key = sorted(kwargs.items(), key=lambda kv: kv[0])
|
||||
|
||||
parts = chain(
|
||||
(qualified_name(func),),
|
||||
# positional args
|
||||
(repr(arg) for arg in args_slice(func, args)),
|
||||
# keyword args
|
||||
(f"{k}={v!r}" for k, v in kwargs_by_key),
|
||||
)
|
||||
|
||||
return ":".join(parts)
|
||||
|
||||
|
||||
def redis_cached(cfg: Config) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
||||
""" """
|
||||
|
||||
def cache_key(func: Callable[P, R], *args: P.args, **kwargs: P.kwargs) -> str:
|
||||
"""Return a cache key for use with cached methods."""
|
||||
|
||||
kwargs_by_key = sorted(kwargs.items(), key=lambda kv: kv[0])
|
||||
|
||||
parts = chain(
|
||||
(qualified_name(func),),
|
||||
# positional args
|
||||
(repr(arg) for arg in args_slice(func, args)),
|
||||
# keyword args
|
||||
(f"{k}={v!r}" for k, v in kwargs_by_key),
|
||||
)
|
||||
|
||||
if cfg.prefix is not None:
|
||||
parts = chain(
|
||||
(cfg.prefix,),
|
||||
parts,
|
||||
)
|
||||
|
||||
return ":".join(parts)
|
||||
|
||||
def decorator(func: Callable[P, R]) -> Callable[P, R]:
|
||||
""" """
|
||||
|
||||
|
|
@ -105,6 +100,9 @@ def redis_cached(cfg: Config) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
|||
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
|
||||
key = cache_key(func, *args, **kwargs)
|
||||
|
||||
if cfg.prefix is not None:
|
||||
key = f"{cfg.prefix}:{key}"
|
||||
|
||||
# pre-hook
|
||||
result = func(*args, **kwargs)
|
||||
# post-hook
|
||||
|
|
|
|||
Loading…
Reference in a new issue