code: def grid_search_generator(grid_basis=[], *args, **kwargs):
      r
      grid_basis_ = grid_basis + list(args) + list(kwargs.items())
      grid_basis_dict = OrderedDict(grid_basis_)
      grid_point_iter = util_dict.iter_all_dict_combinations_ordered(grid_basis_dict)
      for grid_point in grid_point_iter:
          yield grid_point
docs: r"""
      Iteratively yeilds individual configuration points
      inside a defined basis.
  
      Args:
          grid_basis (list): a list of 2-component tuple. The named tuple looks
              like this:
  
      CommandLine:
          python -m utool.util_gridsearch --test-grid_search_generator
  
      Example:
          >>> # ENABLE_DOCTEST
          >>> from utool.util_gridsearch import *  # NOQA
          >>> import utool as ut
          >>> # build test data
          >>> grid_basis = [
          ...     DimensionBasis('dim1', [.1, .2, .3]),
          ...     DimensionBasis('dim2', [.1, .4, .5]),
          ... ]
          >>> args = tuple()
          >>> kwargs = {}
          >>> # execute function
          >>> point_list = list(grid_search_generator(grid_basis))
          >>> # verify results
          >>> column_lbls = ut.get_list_column(grid_basis, 0)
          >>> column_list  = ut.get_list_column(grid_basis, 1)
          >>> first_vals = ut.get_list_column(ut.get_list_column(grid_basis, 1), 0)
          >>> column_types = list(map(type, first_vals))
          >>> header = 'grid search'
          >>> result = ut.make_csv_table(column_list, column_lbls, header, column_types)
          >>> print(result)
          grid search
          # num_rows=3
          #   dim1,  dim2
              0.10,  0.10
              0.20,  0.40
              0.30,  0.50