code: def range(self, dim, data_range=True, dimension_range=True):
          
          dim = self.get_dimension(dim)
  
          if dim is None or (not data_range and not dimension_range):
              return (None, None)
          elif all(util.isfinite(v) for v in dim.range) and dimension_range:
              return dim.range
          elif dim in self.dimensions() and data_range and bool(self):
              lower, upper = self.interface.range(self, dim)
          else:
              lower, upper = (np.NaN, np.NaN)
          if not dimension_range:
              return lower, upper
          return util.dimension_range(lower, upper, dim.range, dim.soft_range)
docs: Return the lower and upper bounds of values along dimension.
  
          Args:
              dimension: The dimension to compute the range on.
              data_range (bool): Compute range from data values
              dimension_range (bool): Include Dimension ranges
                  Whether to include Dimension range and soft_range
                  in range calculation
  
          Returns:
              Tuple containing the lower and upper bound