Skip to content

Commit 938579d

Browse files
mathauseheadtr1ckdcherian
authored
make more args kw only (except 'dim') (#6403)
* make more args kw only (except 'dim') * add deprecation * add forgotten deprecations * doctest fixes * fix some warnings * remove expand_dims again * undo expand_dims, fix mypy * whats-new entry [skip-ci] * add typing to _deprecate_positional_args helper * Update xarray/util/deprecation_helpers.py Co-authored-by: Michael Niklas <[email protected]> * fix kw only for overload * move typing * restore # type: ignore * add type ignores to test_deprecation_helpers --------- Co-authored-by: Michael Niklas <[email protected]> Co-authored-by: Deepak Cherian <[email protected]>
1 parent bd40c20 commit 938579d

8 files changed

+91
-19
lines changed

doc/whats-new.rst

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ New Features
3030
Breaking changes
3131
~~~~~~~~~~~~~~~~
3232

33+
- Made more arguments keyword-only (e.g. ``keep_attrs``, ``skipna``) for many :py:class:`xarray.DataArray` and
34+
:py:class:`xarray.Dataset` methods (:pull:`6403`). By `Mathias Hauser <https://github.com/mathause>`_.
3335
- :py:meth:`Dataset.to_zarr` & :py:meth:`DataArray.to_zarr` require keyword
3436
arguments after the initial 7 positional arguments.
3537
By `Maximilian Roos <https://github.com/max-sixty>`_.

xarray/core/dataarray.py

+33-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
)
6767
from xarray.plot.accessor import DataArrayPlotAccessor
6868
from xarray.plot.utils import _get_units_from_attrs
69+
from xarray.util.deprecation_helpers import _deprecate_positional_args
6970

7071
if TYPE_CHECKING:
7172
from typing import TypeVar, Union
@@ -954,6 +955,7 @@ def coords(self) -> DataArrayCoordinates:
954955
def reset_coords(
955956
self,
956957
names: Dims = None,
958+
*,
957959
drop: Literal[False] = False,
958960
) -> Dataset:
959961
...
@@ -967,9 +969,11 @@ def reset_coords(
967969
) -> Self:
968970
...
969971

972+
@_deprecate_positional_args("v2023.10.0")
970973
def reset_coords(
971974
self,
972975
names: Dims = None,
976+
*,
973977
drop: bool = False,
974978
) -> Self | Dataset:
975979
"""Given names of coordinates, reset them to become variables.
@@ -1287,9 +1291,11 @@ def chunksizes(self) -> Mapping[Any, tuple[int, ...]]:
12871291
all_variables = [self.variable] + [c.variable for c in self.coords.values()]
12881292
return get_chunksizes(all_variables)
12891293

1294+
@_deprecate_positional_args("v2023.10.0")
12901295
def chunk(
12911296
self,
12921297
chunks: T_Chunks = {}, # {} even though it's technically unsafe, is being used intentionally here (#4667)
1298+
*,
12931299
name_prefix: str = "xarray-",
12941300
token: str | None = None,
12951301
lock: bool = False,
@@ -1724,9 +1730,11 @@ def thin(
17241730
ds = self._to_temp_dataset().thin(indexers, **indexers_kwargs)
17251731
return self._from_temp_dataset(ds)
17261732

1733+
@_deprecate_positional_args("v2023.10.0")
17271734
def broadcast_like(
17281735
self,
17291736
other: T_DataArrayOrSet,
1737+
*,
17301738
exclude: Iterable[Hashable] | None = None,
17311739
) -> Self:
17321740
"""Broadcast this DataArray against another Dataset or DataArray.
@@ -1835,9 +1843,11 @@ def _reindex_callback(
18351843

18361844
return da
18371845

1846+
@_deprecate_positional_args("v2023.10.0")
18381847
def reindex_like(
18391848
self,
18401849
other: T_DataArrayOrSet,
1850+
*,
18411851
method: ReindexMethodOptions = None,
18421852
tolerance: int | float | Iterable[int | float] | None = None,
18431853
copy: bool = True,
@@ -2005,9 +2015,11 @@ def reindex_like(
20052015
fill_value=fill_value,
20062016
)
20072017

2018+
@_deprecate_positional_args("v2023.10.0")
20082019
def reindex(
20092020
self,
20102021
indexers: Mapping[Any, Any] | None = None,
2022+
*,
20112023
method: ReindexMethodOptions = None,
20122024
tolerance: float | Iterable[float] | None = None,
20132025
copy: bool = True,
@@ -2787,9 +2799,11 @@ def stack(
27872799
)
27882800
return self._from_temp_dataset(ds)
27892801

2802+
@_deprecate_positional_args("v2023.10.0")
27902803
def unstack(
27912804
self,
27922805
dim: Dims = None,
2806+
*,
27932807
fill_value: Any = dtypes.NA,
27942808
sparse: bool = False,
27952809
) -> Self:
@@ -2847,7 +2861,7 @@ def unstack(
28472861
--------
28482862
DataArray.stack
28492863
"""
2850-
ds = self._to_temp_dataset().unstack(dim, fill_value, sparse)
2864+
ds = self._to_temp_dataset().unstack(dim, fill_value=fill_value, sparse=sparse)
28512865
return self._from_temp_dataset(ds)
28522866

28532867
def to_unstacked_dataset(self, dim: Hashable, level: int | Hashable = 0) -> Dataset:
@@ -3198,9 +3212,11 @@ def drop_isel(
31983212
dataset = dataset.drop_isel(indexers=indexers, **indexers_kwargs)
31993213
return self._from_temp_dataset(dataset)
32003214

3215+
@_deprecate_positional_args("v2023.10.0")
32013216
def dropna(
32023217
self,
32033218
dim: Hashable,
3219+
*,
32043220
how: Literal["any", "all"] = "any",
32053221
thresh: int | None = None,
32063222
) -> Self:
@@ -4696,10 +4712,12 @@ def _title_for_slice(self, truncate: int = 50) -> str:
46964712

46974713
return title
46984714

4715+
@_deprecate_positional_args("v2023.10.0")
46994716
def diff(
47004717
self,
47014718
dim: Hashable,
47024719
n: int = 1,
4720+
*,
47034721
label: Literal["upper", "lower"] = "upper",
47044722
) -> Self:
47054723
"""Calculate the n-th order discrete difference along given axis.
@@ -4985,10 +5003,12 @@ def sortby(
49855003
ds = self._to_temp_dataset().sortby(variables, ascending=ascending)
49865004
return self._from_temp_dataset(ds)
49875005

5006+
@_deprecate_positional_args("v2023.10.0")
49885007
def quantile(
49895008
self,
49905009
q: ArrayLike,
49915010
dim: Dims = None,
5011+
*,
49925012
method: QuantileMethods = "linear",
49935013
keep_attrs: bool | None = None,
49945014
skipna: bool | None = None,
@@ -5103,9 +5123,11 @@ def quantile(
51035123
)
51045124
return self._from_temp_dataset(ds)
51055125

5126+
@_deprecate_positional_args("v2023.10.0")
51065127
def rank(
51075128
self,
51085129
dim: Hashable,
5130+
*,
51095131
pct: bool = False,
51105132
keep_attrs: bool | None = None,
51115133
) -> Self:
@@ -5678,9 +5700,11 @@ def pad(
56785700
)
56795701
return self._from_temp_dataset(ds)
56805702

5703+
@_deprecate_positional_args("v2023.10.0")
56815704
def idxmin(
56825705
self,
56835706
dim: Hashable | None = None,
5707+
*,
56845708
skipna: bool | None = None,
56855709
fill_value: Any = dtypes.NA,
56865710
keep_attrs: bool | None = None,
@@ -5774,9 +5798,11 @@ def idxmin(
57745798
keep_attrs=keep_attrs,
57755799
)
57765800

5801+
@_deprecate_positional_args("v2023.10.0")
57775802
def idxmax(
57785803
self,
57795804
dim: Hashable = None,
5805+
*,
57805806
skipna: bool | None = None,
57815807
fill_value: Any = dtypes.NA,
57825808
keep_attrs: bool | None = None,
@@ -5870,9 +5896,11 @@ def idxmax(
58705896
keep_attrs=keep_attrs,
58715897
)
58725898

5899+
@_deprecate_positional_args("v2023.10.0")
58735900
def argmin(
58745901
self,
58755902
dim: Dims = None,
5903+
*,
58765904
axis: int | None = None,
58775905
keep_attrs: bool | None = None,
58785906
skipna: bool | None = None,
@@ -5970,9 +5998,11 @@ def argmin(
59705998
else:
59715999
return self._replace_maybe_drop_dims(result)
59726000

6001+
@_deprecate_positional_args("v2023.10.0")
59736002
def argmax(
59746003
self,
59756004
dim: Dims = None,
6005+
*,
59766006
axis: int | None = None,
59776007
keep_attrs: bool | None = None,
59786008
skipna: bool | None = None,
@@ -6317,9 +6347,11 @@ def curvefit(
63176347
kwargs=kwargs,
63186348
)
63196349

6350+
@_deprecate_positional_args("v2023.10.0")
63206351
def drop_duplicates(
63216352
self,
63226353
dim: Hashable | Iterable[Hashable],
6354+
*,
63236355
keep: Literal["first", "last", False] = "first",
63246356
) -> Self:
63256357
"""Returns a new DataArray with duplicate dimension values removed.

xarray/core/dataset.py

+19
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
calculate_dimensions,
124124
)
125125
from xarray.plot.accessor import DatasetPlotAccessor
126+
from xarray.util.deprecation_helpers import _deprecate_positional_args
126127

127128
if TYPE_CHECKING:
128129
from numpy.typing import ArrayLike
@@ -4775,9 +4776,11 @@ def set_index(
47754776
variables, coord_names=coord_names, indexes=indexes_
47764777
)
47774778

4779+
@_deprecate_positional_args("v2023.10.0")
47784780
def reset_index(
47794781
self,
47804782
dims_or_levels: Hashable | Sequence[Hashable],
4783+
*,
47814784
drop: bool = False,
47824785
) -> Self:
47834786
"""Reset the specified index(es) or multi-index level(s).
@@ -5412,9 +5415,11 @@ def _unstack_full_reindex(
54125415
variables, coord_names=coord_names, indexes=indexes
54135416
)
54145417

5418+
@_deprecate_positional_args("v2023.10.0")
54155419
def unstack(
54165420
self,
54175421
dim: Dims = None,
5422+
*,
54185423
fill_value: Any = xrdtypes.NA,
54195424
sparse: bool = False,
54205425
) -> Self:
@@ -6155,9 +6160,11 @@ def transpose(
61556160
ds._variables[name] = var.transpose(*var_dims)
61566161
return ds
61576162

6163+
@_deprecate_positional_args("v2023.10.0")
61586164
def dropna(
61596165
self,
61606166
dim: Hashable,
6167+
*,
61616168
how: Literal["any", "all"] = "any",
61626169
thresh: int | None = None,
61636170
subset: Iterable[Hashable] | None = None,
@@ -7583,10 +7590,12 @@ def _copy_attrs_from(self, other):
75837590
if v in self.variables:
75847591
self.variables[v].attrs = other.variables[v].attrs
75857592

7593+
@_deprecate_positional_args("v2023.10.0")
75867594
def diff(
75877595
self,
75887596
dim: Hashable,
75897597
n: int = 1,
7598+
*,
75907599
label: Literal["upper", "lower"] = "upper",
75917600
) -> Self:
75927601
"""Calculate the n-th order discrete difference along given axis.
@@ -7913,10 +7922,12 @@ def sortby(
79137922
indices[key] = order if ascending else order[::-1]
79147923
return aligned_self.isel(indices)
79157924

7925+
@_deprecate_positional_args("v2023.10.0")
79167926
def quantile(
79177927
self,
79187928
q: ArrayLike,
79197929
dim: Dims = None,
7930+
*,
79207931
method: QuantileMethods = "linear",
79217932
numeric_only: bool = False,
79227933
keep_attrs: bool | None = None,
@@ -8091,9 +8102,11 @@ def quantile(
80918102
)
80928103
return new.assign_coords(quantile=q)
80938104

8105+
@_deprecate_positional_args("v2023.10.0")
80948106
def rank(
80958107
self,
80968108
dim: Hashable,
8109+
*,
80978110
pct: bool = False,
80988111
keep_attrs: bool | None = None,
80998112
) -> Self:
@@ -9037,9 +9050,11 @@ def pad(
90379050
attrs = self._attrs if keep_attrs else None
90389051
return self._replace_with_new_dims(variables, indexes=indexes, attrs=attrs)
90399052

9053+
@_deprecate_positional_args("v2023.10.0")
90409054
def idxmin(
90419055
self,
90429056
dim: Hashable | None = None,
9057+
*,
90439058
skipna: bool | None = None,
90449059
fill_value: Any = xrdtypes.NA,
90459060
keep_attrs: bool | None = None,
@@ -9134,9 +9149,11 @@ def idxmin(
91349149
)
91359150
)
91369151

9152+
@_deprecate_positional_args("v2023.10.0")
91379153
def idxmax(
91389154
self,
91399155
dim: Hashable | None = None,
9156+
*,
91409157
skipna: bool | None = None,
91419158
fill_value: Any = xrdtypes.NA,
91429159
keep_attrs: bool | None = None,
@@ -9757,9 +9774,11 @@ def _wrapper(Y, *args, **kwargs):
97579774

97589775
return result
97599776

9777+
@_deprecate_positional_args("v2023.10.0")
97609778
def drop_duplicates(
97619779
self,
97629780
dim: Hashable | Iterable[Hashable],
9781+
*,
97639782
keep: Literal["first", "last", False] = "first",
97649783
) -> Self:
97659784
"""Returns a new Dataset with duplicate dimension values removed.

xarray/core/groupby.py

+3
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
peek_at,
4444
)
4545
from xarray.core.variable import IndexVariable, Variable
46+
from xarray.util.deprecation_helpers import _deprecate_positional_args
4647

4748
if TYPE_CHECKING:
4849
from numpy.typing import ArrayLike
@@ -1092,10 +1093,12 @@ def fillna(self, value: Any) -> T_Xarray:
10921093
"""
10931094
return ops.fillna(self, value)
10941095

1096+
@_deprecate_positional_args("v2023.10.0")
10951097
def quantile(
10961098
self,
10971099
q: ArrayLike,
10981100
dim: Dims = None,
1101+
*,
10991102
method: QuantileMethods = "linear",
11001103
keep_attrs: bool | None = None,
11011104
skipna: bool | None = None,

0 commit comments

Comments
 (0)