docs: def apply_dataset_vfunc(
      func,
      *args,
      signature,
      join='inner',
      dataset_join='exact',
      fill_value=_NO_FILL_VALUE,
      exclude_dims=frozenset(),
      keep_attrs=False
  ):
      """Apply a variable level function over Dataset, dict of DataArray,
      DataArray, Variable and/or ndarray objects.
      """
      from .dataset import Dataset
      first_obj = args[0]  # we'll copy attrs from this in case keep_attrs=True
  
      if (dataset_join not in _JOINS_WITHOUT_FILL_VALUES and
              fill_value is _NO_FILL_VALUE):
          raise TypeError('to apply an operation to datasets with different '
                          'data variables with apply_ufunc, you must supply the '
                          'dataset_fill_value argument.')
  
      if len(args) > 1:
          args = deep_align(args, join=join, copy=False, exclude=exclude_dims,
                            raise_on_invalid=False)
  
      list_of_coords = build_output_coords(args, signature, exclude_dims)
      args = [getattr(arg, 'data_vars', arg) for arg in args]
  
      result_vars = apply_dict_of_variables_vfunc(
          func, *args, signature=signature, join=dataset_join,
          fill_value=fill_value)
  
      if signature.num_outputs > 1:
          out = tuple(_fast_dataset(*args)
                      for args in zip(result_vars, list_of_coords))
      else:
          coord_vars, = list_of_coords
          out = _fast_dataset(result_vars, coord_vars)
  
      if keep_attrs and isinstance(first_obj, Dataset):
          if isinstance(out, tuple):
              out = tuple(ds._copy_attrs_from(first_obj) for ds in out)
          else:
              out._copy_attrs_from(first_obj)
      return out