import hashlib from typing import Any, Dict, List, Tuple def get_key(key, *args, hashed=True, **kwargs) -> str: """ Compose a Redis key. Args: key (str): Key as a format string with placeholders. hashed (bool): Hash key. Returns: str: Complete key constructed by substituting placeholders with provided arguments. """ full_key = key.format(*args, **kwargs) if not hashed: return full_key return hashlib.sha256(full_key.encode()).hexdigest()[:24] def get_key_by_specification(func, args, kwargs, noself=False) -> str: ordered_kwargs = sorted(kwargs.items()) return get_key((func.__module__ or "") + func.__name__ + str(args[1:] if noself else args) + str(ordered_kwargs)) def get_key_by_template( cache_key_template: str, defined_args: List[str] or None = None, args: Tuple or None = None, kwargs: Dict or None = None, key_args_indexes: Tuple[int] or None = None, key_args: Tuple[Any] or None = None, key_kwargs: Dict[str, Any] or None = None, ) -> str: """Generate key. Args: cache_key_template: Cache key template. defined_args: Function full args spec. args: Func call args. kwargs: Func call kwargs. key_args_indexes: Cache key parts indexes in args or None if use all args. key_args: Additional key args. key_kwargs: Additional key kwargs. Returns: Generated key. """ if args and defined_args: key_parts_args = list(args) + [kwargs[a] for a in defined_args if a in kwargs] if key_args_indexes: key_parts_args = [key_parts_args[i] for i in key_args_indexes] if key_args: key_parts_args = list(key_args) + key_parts_args else: key_parts_args = tuple() key_parts_kwargs = {} if kwargs: key_parts_kwargs.update(kwargs) if args: key_parts_kwargs.update({k: v for k, v in zip(defined_args, args)}) if key_kwargs: key_parts_kwargs.update(key_kwargs) return get_key(cache_key_template, *key_parts_args, **key_parts_kwargs)