import hashlib from inspect import FullArgSpec from typing import Any, Dict, List, Tuple, Union import config def get_key_parts( full_kwargs: Dict[str, Any], key_params_names: Tuple[str] or None = None, ignore_params: Tuple[str] or None = None ) -> List: """Get key parts from args and kwargs. Args: full_kwargs: Function kwargs + args as arg name to value mapping. key_params_names: List of key parts names in kwargs. ignore_params: Ignore kwargs names, other params should be key parts. Returns: Key parts list. """ if ignore_params is not None: return [v for k, v in full_kwargs.items() if k not in ignore_params] if key_params_names is not None: return [v for k, v in full_kwargs.items() if k in key_params_names] return list(full_kwargs.values()) def get_full_kwargs(args: tuple, kwargs: dict, args_spec: FullArgSpec) -> Dict[str, Any]: """Get key parts from args and kwargs. Args: args: Function args. kwargs: Function kwargs. args_spec: Function args spec. Returns: Full kwargs which are kwargs + args as arg name to value mapping. """ full_kwargs = {} all_args_count = len(args_spec.args) current_args_count = len(args) for index in range(all_args_count): arg_name = args_spec.args[index] if index < current_args_count: full_kwargs[arg_name] = args[index] elif arg_name in kwargs: full_kwargs[arg_name] = kwargs[arg_name] else: full_kwargs[arg_name] = args_spec.defaults[index - all_args_count] full_kwargs.update(kwargs) return full_kwargs def make_custom_key( key_prefix: str = None, key_value: Union[str, int, None] = None, key_args_params: Tuple[str] or List[str] = None ) -> str: """Returns key for caching. Args: key_prefix: Key prefix. key_value: Main key value to create full key from. key_args_params: Positional args tuple from wrapped function to add to key. Returns: Key string. """ parts = [] if key_value is not None: parts.append(str(key_value)) if key_args_params: parts.extend(",".join(arg) if isinstance(arg, list) else str(arg) for arg in key_args_params) joined_parts = "_".join(parts) if len(joined_parts) > config.MAX_KEY_LENGTH: joined_parts = hashlib.sha3_256(joined_parts.encode("utf-8")).hexdigest() if key_prefix: joined_parts = f"{key_prefix}_{joined_parts}" return joined_parts