def run_method_get_io_dict()

in 3_optimization-design-ptn/03_prompt-optimization/promptwizard/glue/paramlogger/utils.py [0:0]


def run_method_get_io_dict(method_obj, del_self_arg: bool, *argv, **kwargs) -> Dict:
    """
    Run method method_obj with *argv as arguments.
    Create dictionary of all input/ output and other meta data elements to be eventually logged to file.

    :param method_obj: method reference
    :param del_self_arg: True if we shouldn't include `self` variable in output dictionary
    :param argv: Arguments that needs to be passed to method as *argv
    :param kwargs: Arguments that needs to be passed to method as **kwargs

    :return: Dict that has inputs, outputs and meta data to be logged
    """
    args_to_log = defaultdict(dict)

    start_time = time()
    output = method_obj(*argv, **kwargs)
    execution_time = time() - start_time

    # get name of input parameters of method method_obj
    arg_spec = getfullargspec(method_obj)
    arg_names = arg_spec.args
    argv_list = list(argv)

    # Capture all *argv values
    for arg_name, arg_val in zip(arg_names[:len(argv_list)], argv_list):
        if isinstance(arg_val, Hashable) and not (del_self_arg and arg_name == "self"):
            args_to_log[LogLiterals.INPUTS][arg_name] = str(arg_val)

    # Capture all **kwargs values
    args_to_log[LogLiterals.INPUTS].update(kwargs)

    if arg_spec.defaults:
        default_arg_values = list(arg_spec.defaults)
        # For args that don't have any value, set defaults
        arg_with_no_values_count = len(arg_names) - (len(argv_list) + len(kwargs))
        # Number of arguments for which defaults should be used
        defaults_count = min(arg_with_no_values_count, len(default_arg_values))

        # Arguments for which values are not passed but defaults are specified, use defaults
        for arg_names, arg_val in zip(arg_names[-defaults_count:], default_arg_values[-defaults_count:]):
            if isinstance(arg_val, Hashable):
                args_to_log[LogLiterals.INPUTS][arg_name] = str(arg_val)

    args_to_log[LogLiterals.OUTPUTS] = output
    args_to_log[LogLiterals.META][LogLiterals.EXEC_SEC] = execution_time
    args_to_log[LogLiterals.META][LogLiterals.TIMESTAMP] = datetime.now()

    return args_to_log