code: def dim_iter(self, *dim_strides, **kwargs):
          
  
          # Extract dimension names
          dims = [ds[0] for ds in dim_strides]
  
          def _create_dim_dicts(*args):
              return tuple({ 'name': d,
                      'lower_extent': s,
                      'upper_extent': e
                  } for (d, (s, e)) in args)
  
          # Return a tuple-dict-creating generator
          return (_create_dim_dicts(*zip(dims, s)) for s
              in self.endpoint_iter(*dim_strides, **kwargs))
docs: Recursively iterate over the (dimension, stride)
          tuples specified in dim_strides, returning a tuple
          of dictionaries describing a dimension update.
  
          For example, the following call effectively produces
          2 loops over the 'ntime' and 'nchan' dimensions
          in chunks of 10 and 4 respectively.
  
          .. code-block:: python
  
              for d in cube.dim_iter(('ntime', 10), ('nchan', 4))
                  cube.update_dimensions(d)
  
          Parameters
          ----------
          *dim_stride: list
              list of (dimension, stride) tuples
  
  
          Returns
          -------
          iterator
              Iterator produces dictionaries describing dimensions updates.
              :code:`{'name':'ntime', 'lower_extent': 100, 'upper_extent': 200 }`