def create_objects_from_iterables(obj, args: dict, iterables: Dict[str, Any], formatting_options: Dict[str, Any], key_index_name: str = "KeyIndex") -> Tuple[Any, Dict[str, Any], dict]:
    objects = {}
    names = list(iterables)
    logger.debug(f"iterables: {iterables}")
    KeyIndex = create_key_index_object(
        key_index_name = key_index_name,
        iterables = iterables,
    )
    for values in itertools.product(*iterables.values()):
        logger.debug(f"Values: {values}")
        if not values:
            continue
        for name, val in zip(names, values):
            args[name] = val
            formatting_options[name] = str(val)
        object_args = copy.copy(args)
        logger.debug(f"object_args pre format: {object_args}")
        object_args = apply_formatting_dict(object_args, formatting_options)
        print_args = {k: v for k, v in object_args.items() if k != "config"}
        print_args["config"] = "..."
        logger.debug(f"Constructing obj \"{obj}\" with args: \"{print_args}\"")
        objects[KeyIndex(*values)] = obj(**object_args)
    if not objects:
        raise ValueError(iterables, "There appear to be no iterables to use in creating objects.")
    return (KeyIndex, iterables, objects)