From 94e005750118ff1ded01c3c86b9ff0088edac9b1 Mon Sep 17 00:00:00 2001 From: Maximilian Roos Date: Fri, 14 Mar 2025 16:40:24 -0700 Subject: [PATCH] Refactor compatibility modules into xarray.compat package Start of #10089 Move compatibility-related modules from xarray.core to new xarray.compat package: - array_api_compat.py - dask_array_compat.py - dask_array_ops.py - npcompat.py - pdcompat.py --- xarray/coding/cftime_offsets.py | 4 ++-- xarray/coding/times.py | 2 +- xarray/compat/__init__.py | 0 xarray/{core => compat}/array_api_compat.py | 0 xarray/{core => compat}/dask_array_compat.py | 0 xarray/{core => compat}/dask_array_ops.py | 3 +-- xarray/{core => compat}/npcompat.py | 0 xarray/{core => compat}/pdcompat.py | 0 xarray/core/computation.py | 2 +- xarray/core/dataset.py | 2 +- xarray/core/dtypes.py | 5 +++-- xarray/core/duck_array_ops.py | 5 +++-- xarray/core/nputils.py | 2 +- xarray/core/rolling.py | 3 ++- xarray/core/rolling_exp.py | 2 +- xarray/core/variable.py | 2 +- 16 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 xarray/compat/__init__.py rename xarray/{core => compat}/array_api_compat.py (100%) rename xarray/{core => compat}/dask_array_compat.py (100%) rename xarray/{core => compat}/dask_array_ops.py (98%) rename xarray/{core => compat}/npcompat.py (100%) rename xarray/{core => compat}/pdcompat.py (100%) diff --git a/xarray/coding/cftime_offsets.py b/xarray/coding/cftime_offsets.py index 22ba0aa3ce1..bb70da34f18 100644 --- a/xarray/coding/cftime_offsets.py +++ b/xarray/coding/cftime_offsets.py @@ -61,11 +61,11 @@ convert_time_or_go_back, format_cftime_datetime, ) -from xarray.core.common import _contains_datetime_like_objects, is_np_datetime_like -from xarray.core.pdcompat import ( +from xarray.compat.pdcompat import ( count_not_none, default_precision_timestamp, ) +from xarray.core.common import _contains_datetime_like_objects, is_np_datetime_like from xarray.core.types import InclusiveOptions from xarray.core.utils import attempt_import, emit_user_level_warning diff --git a/xarray/coding/times.py b/xarray/coding/times.py index d24a2036dc3..d28c6a2dba3 100644 --- a/xarray/coding/times.py +++ b/xarray/coding/times.py @@ -20,11 +20,11 @@ unpack_for_decoding, unpack_for_encoding, ) +from xarray.compat.pdcompat import default_precision_timestamp, timestamp_as_unit from xarray.core import indexing from xarray.core.common import contains_cftime_datetimes, is_np_datetime_like from xarray.core.duck_array_ops import array_all, array_any, asarray, ravel, reshape from xarray.core.formatting import first_n_items, format_timestamp, last_item -from xarray.core.pdcompat import default_precision_timestamp, timestamp_as_unit from xarray.core.utils import attempt_import, emit_user_level_warning from xarray.core.variable import Variable from xarray.namedarray.parallelcompat import T_ChunkedArray, get_chunked_array_type diff --git a/xarray/compat/__init__.py b/xarray/compat/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/xarray/core/array_api_compat.py b/xarray/compat/array_api_compat.py similarity index 100% rename from xarray/core/array_api_compat.py rename to xarray/compat/array_api_compat.py diff --git a/xarray/core/dask_array_compat.py b/xarray/compat/dask_array_compat.py similarity index 100% rename from xarray/core/dask_array_compat.py rename to xarray/compat/dask_array_compat.py diff --git a/xarray/core/dask_array_ops.py b/xarray/compat/dask_array_ops.py similarity index 98% rename from xarray/core/dask_array_ops.py rename to xarray/compat/dask_array_ops.py index aff676674d0..9534351dbfd 100644 --- a/xarray/core/dask_array_ops.py +++ b/xarray/compat/dask_array_ops.py @@ -2,6 +2,7 @@ import math +from xarray.compat.dask_array_compat import reshape_blockwise from xarray.core import dtypes, nputils @@ -21,8 +22,6 @@ def dask_rolling_wrapper(moving_func, a, window, min_count=None, axis=-1): def least_squares(lhs, rhs, rcond=None, skipna=False): import dask.array as da - from xarray.core.dask_array_compat import reshape_blockwise - # The trick here is that the core dimension is axis 0. # All other dimensions need to be reshaped down to one axis for `lstsq` # (which only accepts 2D input) diff --git a/xarray/core/npcompat.py b/xarray/compat/npcompat.py similarity index 100% rename from xarray/core/npcompat.py rename to xarray/compat/npcompat.py diff --git a/xarray/core/pdcompat.py b/xarray/compat/pdcompat.py similarity index 100% rename from xarray/core/pdcompat.py rename to xarray/compat/pdcompat.py diff --git a/xarray/core/computation.py b/xarray/core/computation.py index 29de030ac5f..39da85982a8 100644 --- a/xarray/core/computation.py +++ b/xarray/core/computation.py @@ -22,9 +22,9 @@ import numpy as np +from xarray.compat.array_api_compat import to_like_array from xarray.core import dtypes, duck_array_ops, utils from xarray.core.alignment import align, deep_align -from xarray.core.array_api_compat import to_like_array from xarray.core.common import zeros_like from xarray.core.duck_array_ops import datetime_to_numeric from xarray.core.formatting import limit_lines diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 79a2dde3444..8f55f9b71a0 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -41,6 +41,7 @@ from xarray.coding.calendar_ops import convert_calendar, interp_calendar from xarray.coding.cftimeindex import CFTimeIndex, _parse_array_of_cftime_strings +from xarray.compat.array_api_compat import to_like_array from xarray.core import ( alignment, duck_array_ops, @@ -57,7 +58,6 @@ align, ) from xarray.core.arithmetic import DatasetArithmetic -from xarray.core.array_api_compat import to_like_array from xarray.core.common import ( DataWithCoords, _contains_datetime_like_objects, diff --git a/xarray/core/dtypes.py b/xarray/core/dtypes.py index 96f660039b5..c959a7f2536 100644 --- a/xarray/core/dtypes.py +++ b/xarray/core/dtypes.py @@ -6,8 +6,9 @@ import numpy as np from pandas.api.types import is_extension_array_dtype -from xarray.core import array_api_compat, npcompat, utils -from xarray.core.npcompat import HAS_STRING_DTYPE +from xarray.compat import array_api_compat, npcompat +from xarray.compat.npcompat import HAS_STRING_DTYPE +from xarray.core import utils # Use as a sentinel value to indicate a dtype appropriate NA value. NA = utils.ReprObject("") diff --git a/xarray/core/duck_array_ops.py b/xarray/core/duck_array_ops.py index 262c023059a..b1d842f30f3 100644 --- a/xarray/core/duck_array_ops.py +++ b/xarray/core/duck_array_ops.py @@ -24,8 +24,9 @@ ) from pandas.api.types import is_extension_array_dtype -from xarray.core import dask_array_compat, dask_array_ops, dtypes, nputils -from xarray.core.array_api_compat import get_array_namespace +from xarray.compat import dask_array_compat, dask_array_ops +from xarray.compat.array_api_compat import get_array_namespace +from xarray.core import dtypes, nputils from xarray.core.options import OPTIONS from xarray.core.utils import is_duck_array, is_duck_dask_array, module_available from xarray.namedarray.parallelcompat import get_chunked_array_type diff --git a/xarray/core/nputils.py b/xarray/core/nputils.py index 3211ab296e6..b517c67bca9 100644 --- a/xarray/core/nputils.py +++ b/xarray/core/nputils.py @@ -7,7 +7,7 @@ import pandas as pd from packaging.version import Version -from xarray.core.array_api_compat import get_array_namespace +from xarray.compat.array_api_compat import get_array_namespace from xarray.core.utils import is_duck_array, module_available from xarray.namedarray import pycompat diff --git a/xarray/core/rolling.py b/xarray/core/rolling.py index 6186f4dacfe..3ed3020ba89 100644 --- a/xarray/core/rolling.py +++ b/xarray/core/rolling.py @@ -9,7 +9,8 @@ import numpy as np -from xarray.core import dask_array_ops, dtypes, duck_array_ops, utils +from xarray.compat import dask_array_ops +from xarray.core import dtypes, duck_array_ops, utils from xarray.core.arithmetic import CoarsenArithmetic from xarray.core.options import OPTIONS, _get_keep_attrs from xarray.core.types import CoarsenBoundaryOptions, SideOptions, T_Xarray diff --git a/xarray/core/rolling_exp.py b/xarray/core/rolling_exp.py index 20b31f6880a..3f32bb2de26 100644 --- a/xarray/core/rolling_exp.py +++ b/xarray/core/rolling_exp.py @@ -5,9 +5,9 @@ import numpy as np +from xarray.compat.pdcompat import count_not_none from xarray.core.computation import apply_ufunc from xarray.core.options import _get_keep_attrs -from xarray.core.pdcompat import count_not_none from xarray.core.types import T_DataWithCoords from xarray.core.utils import module_available diff --git a/xarray/core/variable.py b/xarray/core/variable.py index ed860dc0e6b..5ff6a098016 100644 --- a/xarray/core/variable.py +++ b/xarray/core/variable.py @@ -16,9 +16,9 @@ from pandas.api.types import is_extension_array_dtype import xarray as xr # only for Dataset and DataArray +from xarray.compat.array_api_compat import to_like_array from xarray.core import common, dtypes, duck_array_ops, indexing, nputils, ops, utils from xarray.core.arithmetic import VariableArithmetic -from xarray.core.array_api_compat import to_like_array from xarray.core.common import AbstractArray from xarray.core.extension_array import PandasExtensionArray from xarray.core.indexing import (