docs: def full_like(other, fill_value, dtype: Union[str, np.dtype, None] = None):
      """Return a new object with the same shape and type as a given object.
  
      Parameters
      ----------
      other : DataArray, Dataset, or Variable
          The reference object in input
      fill_value : scalar
          Value to fill the new object with before returning it.
      dtype : dtype, optional
          dtype of the new array. If omitted, it defaults to other.dtype.
  
      Returns
      -------
      out : same as object
          New object with the same shape and type as other, with the data
          filled with fill_value. Coords will be copied from other.
          If other is based on dask, the new one will be as well, and will be
          split in the same chunks.
      """
      from .dataarray import DataArray
      from .dataset import Dataset
      from .variable import Variable
  
      if isinstance(other, Dataset):
          data_vars = OrderedDict(
              (k, _full_like_variable(v, fill_value, dtype))
              for k, v in other.data_vars.items())
          return Dataset(data_vars, coords=other.coords, attrs=other.attrs)
      elif isinstance(other, DataArray):
          return DataArray(
              _full_like_variable(other.variable, fill_value, dtype),
              dims=other.dims, coords=other.coords, attrs=other.attrs,
              name=other.name)
      elif isinstance(other, Variable):
          return _full_like_variable(other, fill_value, dtype)
      else:
          raise TypeError("Expected DataArray, Dataset, or Variable")