code: def full_like(other, fill_value, dtype: Union[str, np.dtype, None] = None):
      
      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")
docs: 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.