docs: def decode_cf_variables(variables, attributes, concat_characters=True,
                          mask_and_scale=True, decode_times=True,
                          decode_coords=True, drop_variables=None,
                          use_cftime=None):
      """
      Decode several CF encoded variables.
  
      See: decode_cf_variable
      """
      dimensions_used_by = defaultdict(list)
      for v in variables.values():
          for d in v.dims:
              dimensions_used_by[d].append(v)
  
      def stackable(dim):
          # figure out if a dimension can be concatenated over
          if dim in variables:
              return False
          for v in dimensions_used_by[dim]:
              if v.dtype.kind != 'S' or dim != v.dims[-1]:
                  return False
          return True
  
      coord_names = set()
  
      if isinstance(drop_variables, str):
          drop_variables = [drop_variables]
      elif drop_variables is None:
          drop_variables = []
      drop_variables = set(drop_variables)
  
      # Time bounds coordinates might miss the decoding attributes
      if decode_times:
          _update_bounds_attributes(variables)
  
      new_vars = OrderedDict()
      for k, v in variables.items():
          if k in drop_variables:
              continue
          stack_char_dim = (concat_characters and v.dtype == 'S1' and
                            v.ndim > 0 and stackable(v.dims[-1]))
          new_vars[k] = decode_cf_variable(
              k, v, concat_characters=concat_characters,
              mask_and_scale=mask_and_scale, decode_times=decode_times,
              stack_char_dim=stack_char_dim, use_cftime=use_cftime)
          if decode_coords:
              var_attrs = new_vars[k].attrs
              if 'coordinates' in var_attrs:
                  coord_str = var_attrs['coordinates']
                  var_coord_names = coord_str.split()
                  if all(k in variables for k in var_coord_names):
                      new_vars[k].encoding['coordinates'] = coord_str
                      del var_attrs['coordinates']
                      coord_names.update(var_coord_names)
  
      if decode_coords and 'coordinates' in attributes:
          attributes = OrderedDict(attributes)
          coord_names.update(attributes.pop('coordinates').split())
  
      return new_vars, attributes, coord_names