code: def range(cls, dataset, dimension):
      column = dataset.dimension_values(dimension)
      if column.dtype.kind == "M":
          return column.min(), column.max()
      elif len(column) == 0:
          return np.nan, np.nan
      else:
          try:
              assert column.dtype.kind not in "SUO"
              with warnings.catch_warnings():
                  warnings.filterwarnings(
                      "ignore", r"All-NaN (slice|axis) encountered"
                  )
                  return finite_range(
                      column, np.nanmin(column), np.nanmax(column)
                  )
          except (AssertionError, TypeError):
              column = [
                  v for v in util.python2sort(column) if v is not None
              ]
              if not len(column):
                  return np.nan, np.nan
              return column[0], column[-1]
  
imports: import sys
  import warnings
  import numpy
  import param
  from ..None import util
  from ..element import Element
  from ..ndmapping import NdMapping
  from .util import finite_range
label_desc: Use image node_id 17 for calling the Interface obj's underlying member method code with example usage: obj.range(cls, dataset, dimension) and returns: column,  column, np,  np, finite_range, column,  column, np,  np