Create dictionary with argument names as keys and their passed values as values.

    An empty dictionary is returned if an error is detected, such as more
    arguments than in the function definition, argument(s) defined by position
    and keyword, etc.

def _create_argument_value_pairs(func, *args, **kwargs):
    """
    Create dictionary with argument names as keys and their passed values as values.

    An empty dictionary is returned if an error is detected, such as more
    arguments than in the function definition, argument(s) defined by position
    and keyword, etc.
    """
    # Capture parameters that have been explicitly specified in function call
    try:
        arg_dict = signature(func).bind_partial(*args, **kwargs).arguments
    except TypeError:
        return dict()
    # Capture parameters that have not been explicitly specified
    # but have default values
    arguments = signature(func).parameters
    for arg_name in arguments:
        if (arguments[arg_name].default != Parameter.empty) and (
            arguments[arg_name].name not in arg_dict
        ):
            arg_dict[arguments[arg_name].name] = arguments[arg_name].default
    return arg_dict