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 }`

def dim_iter(self, *dim_strides, **kwargs):
        """
        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 }`
        """

        # 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))