Skip to content

Commit d644607

Browse files
TomNicholaspre-commit-ci[bot]andersy005
authored
Move parallelcompat and chunkmanagers to NamedArray (#8319)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Anderson Banihirwe <[email protected]> Co-authored-by: Anderson Banihirwe <[email protected]>
1 parent 3d490ec commit d644607

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+566
-562
lines changed

doc/internals/chunked-arrays.rst

+9-9
Original file line numberDiff line numberDiff line change
@@ -35,44 +35,44 @@ The implementation of these functions is specific to the type of arrays passed t
3535
whereas :py:class:`cubed.Array` objects must be processed by :py:func:`cubed.map_blocks`.
3636

3737
In order to use the correct implementation of a core operation for the array type encountered, xarray dispatches to the
38-
corresponding subclass of :py:class:`~xarray.core.parallelcompat.ChunkManagerEntrypoint`,
38+
corresponding subclass of :py:class:`~xarray.namedarray.parallelcompat.ChunkManagerEntrypoint`,
3939
also known as a "Chunk Manager". Therefore **a full list of the operations that need to be defined is set by the
40-
API of the** :py:class:`~xarray.core.parallelcompat.ChunkManagerEntrypoint` **abstract base class**. Note that chunked array
40+
API of the** :py:class:`~xarray.namedarray.parallelcompat.ChunkManagerEntrypoint` **abstract base class**. Note that chunked array
4141
methods are also currently dispatched using this class.
4242

4343
Chunked array creation is also handled by this class. As chunked array objects have a one-to-one correspondence with
4444
in-memory numpy arrays, it should be possible to create a chunked array from a numpy array by passing the desired
45-
chunking pattern to an implementation of :py:class:`~xarray.core.parallelcompat.ChunkManagerEntrypoint.from_array``.
45+
chunking pattern to an implementation of :py:class:`~xarray.namedarray.parallelcompat.ChunkManagerEntrypoint.from_array``.
4646

4747
.. note::
4848

49-
The :py:class:`~xarray.core.parallelcompat.ChunkManagerEntrypoint` abstract base class is mostly just acting as a
49+
The :py:class:`~xarray.namedarray.parallelcompat.ChunkManagerEntrypoint` abstract base class is mostly just acting as a
5050
namespace for containing the chunked-aware function primitives. Ideally in the future we would have an API standard
5151
for chunked array types which codified this structure, making the entrypoint system unnecessary.
5252

53-
.. currentmodule:: xarray.core.parallelcompat
53+
.. currentmodule:: xarray.namedarray.parallelcompat
5454

55-
.. autoclass:: xarray.core.parallelcompat.ChunkManagerEntrypoint
55+
.. autoclass:: xarray.namedarray.parallelcompat.ChunkManagerEntrypoint
5656
:members:
5757

5858
Registering a new ChunkManagerEntrypoint subclass
5959
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6060

6161
Rather than hard-coding various chunk managers to deal with specific chunked array implementations, xarray uses an
6262
entrypoint system to allow developers of new chunked array implementations to register their corresponding subclass of
63-
:py:class:`~xarray.core.parallelcompat.ChunkManagerEntrypoint`.
63+
:py:class:`~xarray.namedarray.parallelcompat.ChunkManagerEntrypoint`.
6464

6565

6666
To register a new entrypoint you need to add an entry to the ``setup.cfg`` like this::
6767

6868
[options.entry_points]
6969
xarray.chunkmanagers =
70-
dask = xarray.core.daskmanager:DaskManager
70+
dask = xarray.namedarray.daskmanager:DaskManager
7171

7272
See also `cubed-xarray <https://github.com/xarray-contrib/cubed-xarray>`_ for another example.
7373

7474
To check that the entrypoint has worked correctly, you may find it useful to display the available chunkmanagers using
75-
the internal function :py:func:`~xarray.core.parallelcompat.list_chunkmanagers`.
75+
the internal function :py:func:`~xarray.namedarray.parallelcompat.list_chunkmanagers`.
7676

7777
.. autofunction:: list_chunkmanagers
7878

doc/whats-new.rst

+3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ Internal Changes
8888
when the data isn't datetime-like. (:issue:`8718`, :pull:`8724`)
8989
By `Maximilian Roos <https://github.com/max-sixty>`_.
9090

91+
- Move `parallelcompat` and `chunk managers` modules from `xarray/core` to `xarray/namedarray`. (:pull:`8319`)
92+
By `Tom Nicholas <https://github.com/TomNicholas>`_ and `Anderson Banihirwe <https://github.com/andersy005>`_.
93+
9194
.. _whats-new.2024.01.1:
9295

9396
v2024.01.1 (23 Jan, 2024)

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ issue-tracker = "https://github.com/pydata/xarray/issues"
5454
source-code = "https://github.com/pydata/xarray"
5555

5656
[project.entry-points."xarray.chunkmanagers"]
57-
dask = "xarray.core.daskmanager:DaskManager"
57+
dask = "xarray.namedarray.daskmanager:DaskManager"
5858

5959
[build-system]
6060
build-backend = "setuptools.build_meta"

xarray/backends/api.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@
3434
_nested_combine,
3535
combine_by_coords,
3636
)
37-
from xarray.core.daskmanager import DaskManager
3837
from xarray.core.dataarray import DataArray
3938
from xarray.core.dataset import Dataset, _get_chunk, _maybe_chunk
4039
from xarray.core.indexes import Index
41-
from xarray.core.parallelcompat import guess_chunkmanager
4240
from xarray.core.types import ZarrWriteModes
4341
from xarray.core.utils import is_remote_uri
42+
from xarray.namedarray.daskmanager import DaskManager
43+
from xarray.namedarray.parallelcompat import guess_chunkmanager
4444

4545
if TYPE_CHECKING:
4646
try:

xarray/backends/common.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
from xarray.conventions import cf_encoder
1414
from xarray.core import indexing
15-
from xarray.core.parallelcompat import get_chunked_array_type
16-
from xarray.core.pycompat import is_chunked_array
1715
from xarray.core.utils import FrozenDict, NdimSizeLenMixin, is_remote_uri
16+
from xarray.namedarray.parallelcompat import get_chunked_array_type
17+
from xarray.namedarray.pycompat import is_chunked_array
1818

1919
if TYPE_CHECKING:
2020
from io import BufferedIOBase

xarray/backends/pydap_.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
)
1515
from xarray.backends.store import StoreBackendEntrypoint
1616
from xarray.core import indexing
17-
from xarray.core.pycompat import integer_types
1817
from xarray.core.utils import (
1918
Frozen,
2019
FrozenDict,
@@ -23,6 +22,7 @@
2322
is_remote_uri,
2423
)
2524
from xarray.core.variable import Variable
25+
from xarray.namedarray.pycompat import integer_types
2626

2727
if TYPE_CHECKING:
2828
import os

xarray/backends/zarr.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@
1919
)
2020
from xarray.backends.store import StoreBackendEntrypoint
2121
from xarray.core import indexing
22-
from xarray.core.parallelcompat import guess_chunkmanager
23-
from xarray.core.pycompat import integer_types
2422
from xarray.core.types import ZarrWriteModes
2523
from xarray.core.utils import (
2624
FrozenDict,
2725
HiddenKeyDict,
2826
close_on_error,
2927
)
3028
from xarray.core.variable import Variable
29+
from xarray.namedarray.parallelcompat import guess_chunkmanager
30+
from xarray.namedarray.pycompat import integer_types
3131

3232
if TYPE_CHECKING:
3333
from io import BufferedIOBase

xarray/coding/strings.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
unpack_for_encoding,
1616
)
1717
from xarray.core import indexing
18-
from xarray.core.parallelcompat import get_chunked_array_type, is_chunked_array
1918
from xarray.core.variable import Variable
19+
from xarray.namedarray.parallelcompat import get_chunked_array_type
20+
from xarray.namedarray.pycompat import is_chunked_array
2021

2122

2223
def create_vlen_dtype(element_type):

xarray/coding/times.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
from xarray.core.common import contains_cftime_datetimes, is_np_datetime_like
2525
from xarray.core.duck_array_ops import asarray
2626
from xarray.core.formatting import first_n_items, format_timestamp, last_item
27-
from xarray.core.parallelcompat import T_ChunkedArray, get_chunked_array_type
2827
from xarray.core.pdcompat import nanosecond_precision_timestamp
29-
from xarray.core.pycompat import is_chunked_array, is_duck_dask_array
3028
from xarray.core.utils import emit_user_level_warning
3129
from xarray.core.variable import Variable
30+
from xarray.namedarray.parallelcompat import T_ChunkedArray, get_chunked_array_type
31+
from xarray.namedarray.pycompat import is_chunked_array
32+
from xarray.namedarray.utils import is_duck_dask_array
3233

3334
try:
3435
import cftime

xarray/coding/variables.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
import pandas as pd
1212

1313
from xarray.core import dtypes, duck_array_ops, indexing
14-
from xarray.core.parallelcompat import get_chunked_array_type
15-
from xarray.core.pycompat import is_chunked_array
1614
from xarray.core.variable import Variable
15+
from xarray.namedarray.parallelcompat import get_chunked_array_type
16+
from xarray.namedarray.pycompat import is_chunked_array
1717

1818
if TYPE_CHECKING:
1919
T_VarTuple = tuple[tuple[Hashable, ...], Any, dict, dict]
@@ -163,7 +163,7 @@ def lazy_elemwise_func(array, func: Callable, dtype: np.typing.DTypeLike):
163163
if is_chunked_array(array):
164164
chunkmanager = get_chunked_array_type(array)
165165

166-
return chunkmanager.map_blocks(func, array, dtype=dtype)
166+
return chunkmanager.map_blocks(func, array, dtype=dtype) # type: ignore[arg-type]
167167
else:
168168
return _ElementwiseFunctionArray(array, func, dtype)
169169

xarray/conventions.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
_contains_datetime_like_objects,
1515
contains_cftime_datetimes,
1616
)
17-
from xarray.core.pycompat import is_duck_dask_array
1817
from xarray.core.utils import emit_user_level_warning
1918
from xarray.core.variable import IndexVariable, Variable
19+
from xarray.namedarray.utils import is_duck_dask_array
2020

2121
CF_RELATED_DATA = (
2222
"bounds",

xarray/convert.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from xarray.core import duck_array_ops
1111
from xarray.core.dataarray import DataArray
1212
from xarray.core.dtypes import get_fill_value
13-
from xarray.core.pycompat import array_type
13+
from xarray.namedarray.pycompat import array_type
1414

1515
iris_forbidden_keys = {
1616
"standard_name",

xarray/core/accessor_dt.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
is_np_datetime_like,
1414
is_np_timedelta_like,
1515
)
16-
from xarray.core.pycompat import is_duck_dask_array
1716
from xarray.core.types import T_DataArray
1817
from xarray.core.variable import IndexVariable
18+
from xarray.namedarray.utils import is_duck_dask_array
1919

2020
if TYPE_CHECKING:
2121
from numpy.typing import DTypeLike

xarray/core/arithmetic.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,9 @@
1515
VariableOpsMixin,
1616
)
1717
from xarray.core.common import ImplementsArrayReduce, ImplementsDatasetReduce
18-
from xarray.core.ops import (
19-
IncludeNumpySameMethods,
20-
IncludeReduceMethods,
21-
)
18+
from xarray.core.ops import IncludeNumpySameMethods, IncludeReduceMethods
2219
from xarray.core.options import OPTIONS, _get_keep_attrs
23-
from xarray.core.pycompat import is_duck_array
20+
from xarray.namedarray.utils import is_duck_array
2421

2522

2623
class SupportsArithmetic:

xarray/core/common.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@
1313
from xarray.core import dtypes, duck_array_ops, formatting, formatting_html, ops
1414
from xarray.core.indexing import BasicIndexer, ExplicitlyIndexed
1515
from xarray.core.options import OPTIONS, _get_keep_attrs
16-
from xarray.core.parallelcompat import get_chunked_array_type, guess_chunkmanager
17-
from xarray.core.pycompat import is_chunked_array
1816
from xarray.core.utils import (
1917
Frozen,
2018
either_dict_or_kwargs,
2119
emit_user_level_warning,
2220
is_scalar,
2321
)
2422
from xarray.namedarray.core import _raise_if_any_duplicate_dimensions
23+
from xarray.namedarray.parallelcompat import get_chunked_array_type, guess_chunkmanager
24+
from xarray.namedarray.pycompat import is_chunked_array
2525

2626
try:
2727
import cftime

xarray/core/computation.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
from xarray.core.indexes import Index, filter_indexes_from_coords
2323
from xarray.core.merge import merge_attrs, merge_coordinates_without_align
2424
from xarray.core.options import OPTIONS, _get_keep_attrs
25-
from xarray.core.parallelcompat import get_chunked_array_type
26-
from xarray.core.pycompat import is_chunked_array, is_duck_dask_array
2725
from xarray.core.types import Dims, T_DataArray
28-
from xarray.core.utils import is_dict_like, is_scalar, parse_dims
26+
from xarray.core.utils import is_dict_like, is_duck_dask_array, is_scalar, parse_dims
2927
from xarray.core.variable import Variable
28+
from xarray.namedarray.parallelcompat import get_chunked_array_type
29+
from xarray.namedarray.pycompat import is_chunked_array
3030
from xarray.util.deprecation_helpers import deprecate_dims
3131

3232
if TYPE_CHECKING:

xarray/core/dataarray.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@
6464
_default,
6565
either_dict_or_kwargs,
6666
hashable,
67+
infix_dims,
6768
)
6869
from xarray.core.variable import (
6970
IndexVariable,
7071
Variable,
7172
as_compatible_data,
7273
as_variable,
7374
)
74-
from xarray.namedarray.utils import infix_dims
7575
from xarray.plot.accessor import DataArrayPlotAccessor
7676
from xarray.plot.utils import _get_units_from_attrs
7777
from xarray.util.deprecation_helpers import _deprecate_positional_args, deprecate_dims
@@ -85,7 +85,6 @@
8585
from xarray.backends import ZarrStore
8686
from xarray.backends.api import T_NetcdfEngine, T_NetcdfTypes
8787
from xarray.core.groupby import DataArrayGroupBy
88-
from xarray.core.parallelcompat import ChunkManagerEntrypoint
8988
from xarray.core.resample import DataArrayResample
9089
from xarray.core.rolling import DataArrayCoarsen, DataArrayRolling
9190
from xarray.core.types import (
@@ -108,6 +107,7 @@
108107
T_Xarray,
109108
)
110109
from xarray.core.weighted import DataArrayWeighted
110+
from xarray.namedarray.parallelcompat import ChunkManagerEntrypoint
111111

112112
T_XarrayOther = TypeVar("T_XarrayOther", bound=Union["DataArray", Dataset])
113113

xarray/core/dataset.py

+13-11
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
assert_coordinate_consistent,
6464
create_coords_with_default_indexes,
6565
)
66-
from xarray.core.daskmanager import DaskManager
6766
from xarray.core.duck_array_ops import datetime_to_numeric
6867
from xarray.core.indexes import (
6968
Index,
@@ -86,13 +85,6 @@
8685
)
8786
from xarray.core.missing import get_clean_interp_index
8887
from xarray.core.options import OPTIONS, _get_keep_attrs
89-
from xarray.core.parallelcompat import get_chunked_array_type, guess_chunkmanager
90-
from xarray.core.pycompat import (
91-
array_type,
92-
is_chunked_array,
93-
is_duck_array,
94-
is_duck_dask_array,
95-
)
9688
from xarray.core.types import (
9789
QuantileMethods,
9890
Self,
@@ -114,6 +106,10 @@
114106
drop_dims_from_indexers,
115107
either_dict_or_kwargs,
116108
emit_user_level_warning,
109+
infix_dims,
110+
is_dict_like,
111+
is_duck_array,
112+
is_duck_dask_array,
117113
is_scalar,
118114
maybe_wrap_array,
119115
)
@@ -124,7 +120,8 @@
124120
broadcast_variables,
125121
calculate_dimensions,
126122
)
127-
from xarray.namedarray.utils import infix_dims, is_dict_like
123+
from xarray.namedarray.parallelcompat import get_chunked_array_type, guess_chunkmanager
124+
from xarray.namedarray.pycompat import array_type, is_chunked_array
128125
from xarray.plot.accessor import DatasetPlotAccessor
129126
from xarray.util.deprecation_helpers import _deprecate_positional_args
130127

@@ -138,7 +135,6 @@
138135
from xarray.core.dataarray import DataArray
139136
from xarray.core.groupby import DatasetGroupBy
140137
from xarray.core.merge import CoercibleMapping, CoercibleValue, _MergeResult
141-
from xarray.core.parallelcompat import ChunkManagerEntrypoint
142138
from xarray.core.resample import DatasetResample
143139
from xarray.core.rolling import DatasetCoarsen, DatasetRolling
144140
from xarray.core.types import (
@@ -164,6 +160,7 @@
164160
T_Xarray,
165161
)
166162
from xarray.core.weighted import DatasetWeighted
163+
from xarray.namedarray.parallelcompat import ChunkManagerEntrypoint
167164

168165

169166
# list of attributes of pd.DatetimeIndex that are ndarrays of time info
@@ -292,6 +289,9 @@ def _maybe_chunk(
292289
chunked_array_type: str | ChunkManagerEntrypoint | None = None,
293290
from_array_kwargs=None,
294291
):
292+
293+
from xarray.namedarray.daskmanager import DaskManager
294+
295295
if chunks is not None:
296296
chunks = {dim: chunks[dim] for dim in var.dims if dim in chunks}
297297

@@ -842,7 +842,9 @@ def load(self, **kwargs) -> Self:
842842
chunkmanager = get_chunked_array_type(*lazy_data.values())
843843

844844
# evaluate all the chunked arrays simultaneously
845-
evaluated_data = chunkmanager.compute(*lazy_data.values(), **kwargs)
845+
evaluated_data: tuple[np.ndarray[Any, Any], ...] = chunkmanager.compute(
846+
*lazy_data.values(), **kwargs
847+
)
846848

847849
for k, data in zip(lazy_data, evaluated_data):
848850
self.variables[k].data = data

xarray/core/duck_array_ops.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@
3333
from numpy.lib.stride_tricks import sliding_window_view # noqa
3434
from packaging.version import Version
3535

36-
from xarray.core import dask_array_ops, dtypes, nputils, pycompat
36+
from xarray.core import dask_array_ops, dtypes, nputils
3737
from xarray.core.options import OPTIONS
38-
from xarray.core.parallelcompat import get_chunked_array_type, is_chunked_array
39-
from xarray.core.pycompat import array_type, is_duck_dask_array
40-
from xarray.core.utils import is_duck_array, module_available
38+
from xarray.core.utils import is_duck_array, is_duck_dask_array, module_available
39+
from xarray.namedarray import pycompat
40+
from xarray.namedarray.parallelcompat import get_chunked_array_type
41+
from xarray.namedarray.pycompat import array_type, is_chunked_array
4142

4243
# remove once numpy 2.0 is the oldest supported version
4344
if module_available("numpy", minversion="2.0.0.dev0"):

xarray/core/formatting.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
from xarray.core.duck_array_ops import array_equiv, astype
2121
from xarray.core.indexing import MemoryCachedArray
2222
from xarray.core.options import OPTIONS, _get_boolean_with_default
23-
from xarray.core.pycompat import array_type, to_duck_array, to_numpy
2423
from xarray.core.utils import is_duck_array
24+
from xarray.namedarray.pycompat import array_type, to_duck_array, to_numpy
2525

2626
if TYPE_CHECKING:
2727
from xarray.core.coordinates import AbstractCoordinates

0 commit comments

Comments
 (0)