1313 Iterator ,
1414 Mapping ,
1515 TypeVar ,
16+ Union ,
1617 overload ,
1718)
1819
1920import numpy as np
2021import pandas as pd
2122
2223from . import dtypes , duck_array_ops , formatting , formatting_html , ops
23- from .npcompat import DTypeLike
24+ from .npcompat import DTypeLike , DTypeLikeSave
2425from .options import OPTIONS , _get_keep_attrs
2526from .pycompat import is_duck_dask_array
2627from .rolling_exp import RollingExp
@@ -1577,26 +1578,45 @@ def __getitem__(self, value):
15771578 raise NotImplementedError ()
15781579
15791580
1581+ DTypeMaybeMapping = Union [DTypeLikeSave , Mapping [Any , DTypeLikeSave ]]
1582+
1583+
15801584@overload
1581- def full_like (
1582- other : Dataset ,
1583- fill_value ,
1584- dtype : DTypeLike | Mapping [Any , DTypeLike ] = None ,
1585- ) -> Dataset :
1585+ def full_like (other : DataArray , fill_value : Any , dtype : DTypeLikeSave ) -> DataArray :
1586+ ...
1587+
1588+
1589+ @overload
1590+ def full_like (other : Dataset , fill_value : Any , dtype : DTypeMaybeMapping ) -> Dataset :
15861591 ...
15871592
15881593
15891594@overload
1590- def full_like (other : DataArray , fill_value , dtype : DTypeLike = None ) -> DataArray :
1595+ def full_like (other : Variable , fill_value : Any , dtype : DTypeLikeSave ) -> Variable :
15911596 ...
15921597
15931598
15941599@overload
1595- def full_like (other : Variable , fill_value , dtype : DTypeLike = None ) -> Variable :
1600+ def full_like (
1601+ other : Dataset | DataArray , fill_value : Any , dtype : DTypeMaybeMapping = None
1602+ ) -> Dataset | DataArray :
15961603 ...
15971604
15981605
1599- def full_like (other , fill_value , dtype = None ):
1606+ @overload
1607+ def full_like (
1608+ other : Dataset | DataArray | Variable ,
1609+ fill_value : Any ,
1610+ dtype : DTypeMaybeMapping = None ,
1611+ ) -> Dataset | DataArray | Variable :
1612+ ...
1613+
1614+
1615+ def full_like (
1616+ other : Dataset | DataArray | Variable ,
1617+ fill_value : Any ,
1618+ dtype : DTypeMaybeMapping = None ,
1619+ ) -> Dataset | DataArray | Variable :
16001620 """Return a new object with the same shape and type as a given object.
16011621
16021622 Parameters
@@ -1711,26 +1731,26 @@ def full_like(other, fill_value, dtype=None):
17111731 f"fill_value must be scalar or, for datasets, a dict-like. Received { fill_value } instead."
17121732 )
17131733
1714- if not isinstance (other , Dataset ) and isinstance (dtype , Mapping ):
1715- raise ValueError (
1716- "'dtype' cannot be dict-like when passing a DataArray or Variable"
1717- )
1718-
17191734 if isinstance (other , Dataset ):
17201735 if not isinstance (fill_value , dict ):
17211736 fill_value = {k : fill_value for k in other .data_vars .keys ()}
17221737
1738+ dtype_ : Mapping [Any , DTypeLikeSave ]
17231739 if not isinstance (dtype , Mapping ):
17241740 dtype_ = {k : dtype for k in other .data_vars .keys ()}
17251741 else :
17261742 dtype_ = dtype
17271743
17281744 data_vars = {
1729- k : _full_like_variable (v , fill_value .get (k , dtypes .NA ), dtype_ .get (k , None ))
1745+ k : _full_like_variable (
1746+ v .variable , fill_value .get (k , dtypes .NA ), dtype_ .get (k , None )
1747+ )
17301748 for k , v in other .data_vars .items ()
17311749 }
17321750 return Dataset (data_vars , coords = other .coords , attrs = other .attrs )
17331751 elif isinstance (other , DataArray ):
1752+ if isinstance (dtype , Mapping ):
1753+ raise ValueError ("'dtype' cannot be dict-like when passing a DataArray" )
17341754 return DataArray (
17351755 _full_like_variable (other .variable , fill_value , dtype ),
17361756 dims = other .dims ,
@@ -1739,12 +1759,16 @@ def full_like(other, fill_value, dtype=None):
17391759 name = other .name ,
17401760 )
17411761 elif isinstance (other , Variable ):
1762+ if isinstance (dtype , Mapping ):
1763+ raise ValueError ("'dtype' cannot be dict-like when passing a Variable" )
17421764 return _full_like_variable (other , fill_value , dtype )
17431765 else :
17441766 raise TypeError ("Expected DataArray, Dataset, or Variable" )
17451767
17461768
1747- def _full_like_variable (other , fill_value , dtype : DTypeLike = None ):
1769+ def _full_like_variable (
1770+ other : Variable , fill_value : Any , dtype : DTypeLike = None
1771+ ) -> Variable :
17481772 """Inner function of full_like, where other must be a variable"""
17491773 from .variable import Variable
17501774
@@ -1765,7 +1789,38 @@ def _full_like_variable(other, fill_value, dtype: DTypeLike = None):
17651789 return Variable (dims = other .dims , data = data , attrs = other .attrs )
17661790
17671791
1768- def zeros_like (other , dtype : DTypeLike = None ):
1792+ @overload
1793+ def zeros_like (other : DataArray , dtype : DTypeLikeSave ) -> DataArray :
1794+ ...
1795+
1796+
1797+ @overload
1798+ def zeros_like (other : Dataset , dtype : DTypeMaybeMapping ) -> Dataset :
1799+ ...
1800+
1801+
1802+ @overload
1803+ def zeros_like (other : Variable , dtype : DTypeLikeSave ) -> Variable :
1804+ ...
1805+
1806+
1807+ @overload
1808+ def zeros_like (
1809+ other : Dataset | DataArray , dtype : DTypeMaybeMapping = None
1810+ ) -> Dataset | DataArray :
1811+ ...
1812+
1813+
1814+ @overload
1815+ def zeros_like (
1816+ other : Dataset | DataArray | Variable , dtype : DTypeMaybeMapping = None
1817+ ) -> Dataset | DataArray | Variable :
1818+ ...
1819+
1820+
1821+ def zeros_like (
1822+ other : Dataset | DataArray | Variable , dtype : DTypeMaybeMapping = None
1823+ ) -> Dataset | DataArray | Variable :
17691824 """Return a new object of zeros with the same shape and
17701825 type as a given dataarray or dataset.
17711826
@@ -1821,7 +1876,38 @@ def zeros_like(other, dtype: DTypeLike = None):
18211876 return full_like (other , 0 , dtype )
18221877
18231878
1824- def ones_like (other , dtype : DTypeLike = None ):
1879+ @overload
1880+ def ones_like (other : DataArray , dtype : DTypeLikeSave ) -> DataArray :
1881+ ...
1882+
1883+
1884+ @overload
1885+ def ones_like (other : Dataset , dtype : DTypeMaybeMapping ) -> Dataset :
1886+ ...
1887+
1888+
1889+ @overload
1890+ def ones_like (other : Variable , dtype : DTypeLikeSave ) -> Variable :
1891+ ...
1892+
1893+
1894+ @overload
1895+ def ones_like (
1896+ other : Dataset | DataArray , dtype : DTypeMaybeMapping = None
1897+ ) -> Dataset | DataArray :
1898+ ...
1899+
1900+
1901+ @overload
1902+ def ones_like (
1903+ other : Dataset | DataArray | Variable , dtype : DTypeMaybeMapping = None
1904+ ) -> Dataset | DataArray | Variable :
1905+ ...
1906+
1907+
1908+ def ones_like (
1909+ other : Dataset | DataArray | Variable , dtype : DTypeMaybeMapping = None
1910+ ) -> Dataset | DataArray | Variable :
18251911 """Return a new object of ones with the same shape and
18261912 type as a given dataarray or dataset.
18271913
0 commit comments