code: def _preprocess_and_rename_grid_attrs(func, grid_attrs=None, **kwargs):
      
  
      def func_wrapper(ds):
          return grid_attrs_to_aospy_names(func(ds, **kwargs), grid_attrs)
      return func_wrapper
docs: Call a custom preprocessing method first then rename grid attrs.
  
      This wrapper is needed to generate a single function to pass to the
      ``preprocesss`` of xr.open_mfdataset.  It makes sure that the
      user-specified preprocess function is called on the loaded Dataset before
      aospy's is applied.  An example for why this might be needed is output from
      the WRF model; one needs to add a CF-compliant units attribute to the time
      coordinate of all input files, because it is not present by default.
  
      Parameters
      ----------
      func : function
         An arbitrary function to call before calling
         ``grid_attrs_to_aospy_names`` in ``_load_data_from_disk``.  Must take
         an xr.Dataset as an argument as well as ``**kwargs``.
      grid_attrs : dict (optional)
          Overriding dictionary of grid attributes mapping aospy internal
          names to names of grid attributes used in a particular model.
  
      Returns
      -------
      function
          A function that calls the provided function ``func`` on the Dataset
          before calling ``grid_attrs_to_aospy_names``; this is meant to be
          passed as a ``preprocess`` argument to ``xr.open_mfdataset``.