code: 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)