import inspect from typing import Any, Tuple def get_arg( args: tuple, kwargs: dict, args_spec: inspect.FullArgSpec, arg_name: str, from_default: bool = False ) -> Any: """Get arg value by name from args or kwargs. Args: args: Function args. kwargs: Function kwargs. args_spec: Function args spec. arg_name: Function arg name. from_default: Allow get value from args defaults. Returns: Arg value. """ if arg_name in kwargs: return kwargs[arg_name] if arg_name not in args_spec.args: return None index = args_spec.args.index(arg_name) if len(args) > index: return args[index] if not from_default: return None return args_spec.defaults[index - len(args_spec.args)] def set_arg( args: tuple, kwargs: dict, args_spec: inspect.FullArgSpec, arg_name: str, value: Any, filter_kwargs: bool = False ) -> Tuple[tuple, dict]: """Set arg value by name to args or kwargs. Args: args: Function args. kwargs: Function kwargs. args_spec: Function args spec. arg_name: Function arg name. value: New arg value. filter_kwargs: Filter kwargs that does not exists in args spec. Returns: Modified args and kwargs. """ if filter_kwargs: modified_kwargs = {k: v for k, v in kwargs.items() if k in args_spec.args} else: modified_kwargs = dict(kwargs) index = args_spec.args.index(arg_name) if arg_name in args_spec.args else -1 if arg_name in kwargs or index < 0 or len(args) <= index: modified_kwargs[arg_name] = value return args, modified_kwargs modified_args = list(args) modified_args[index] = value return tuple(modified_args), modified_kwargs