Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 2 additions & 7 deletions xarray/core/dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,7 @@
from xarray.computation import ops
from xarray.computation.arithmetic import DatasetArithmetic
from xarray.core import dtypes as xrdtypes
from xarray.core import (
duck_array_ops,
formatting,
formatting_html,
utils,
)
from xarray.core import duck_array_ops, formatting, formatting_html, utils
from xarray.core._aggregations import DatasetAggregations
from xarray.core.common import (
DataWithCoords,
Expand Down Expand Up @@ -2563,7 +2558,7 @@ def _validate_indexers(

# all indexers should be int, slice, np.ndarrays, or Variable
for k, v in indexers.items():
if isinstance(v, int | slice | Variable):
if isinstance(v, int | slice | Variable) and not isinstance(v, bool):
yield k, v
elif isinstance(v, DataArray):
yield k, v.variable
Expand Down
12 changes: 4 additions & 8 deletions xarray/core/indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ def __init__(

new_key = []
for k in key:
if isinstance(k, integer_types):
if isinstance(k, integer_types) and not isinstance(k, bool):
k = int(k)
elif isinstance(k, slice):
k = as_integer_slice(k)
Expand All @@ -513,7 +513,7 @@ def __init__(
k = duck_array_ops.astype(k, np.int64, copy=False)
else:
raise TypeError(
f"unexpected indexer type for {type(self).__name__}: {k!r}"
f"unexpected indexer type for {type(self).__name__}: {k!r}, {type(k)}"
)
new_key.append(k)

Expand Down Expand Up @@ -1585,7 +1585,7 @@ def is_fancy_indexer(indexer: Any) -> bool:
"""Return False if indexer is a int, slice, a 1-dimensional list, or a 0 or
1-dimensional ndarray; in all other cases return True
"""
if isinstance(indexer, int | slice):
if isinstance(indexer, int | slice) and not isinstance(indexer, bool):
return False
if isinstance(indexer, np.ndarray):
return indexer.ndim > 1
Expand Down Expand Up @@ -1717,11 +1717,7 @@ def transpose(self, order):


def _apply_vectorized_indexer_dask_wrapper(indices, coord):
from xarray.core.indexing import (
VectorizedIndexer,
apply_indexer,
as_indexable,
)
from xarray.core.indexing import VectorizedIndexer, apply_indexer, as_indexable

return apply_indexer(
as_indexable(coord), VectorizedIndexer((indices.squeeze(axis=-1),))
Expand Down
5 changes: 4 additions & 1 deletion xarray/core/variable.py
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,10 @@ def _broadcast_indexes(self, key):
k.item() if isinstance(k, np.ndarray) and k.ndim == 0 else k for k in key
)

if all(isinstance(k, BASIC_INDEXING_TYPES) for k in key):
if all(
(isinstance(k, BASIC_INDEXING_TYPES) and not isinstance(k, bool))
for k in key
):
return self._broadcast_indexes_basic(key)

self._validate_indexers(key)
Expand Down
16 changes: 11 additions & 5 deletions xarray/tests/test_dataarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,7 @@
from xarray.core import dtypes
from xarray.core.common import full_like
from xarray.core.coordinates import Coordinates, CoordinateValidationError
from xarray.core.indexes import (
Index,
PandasIndex,
filter_indexes_from_coords,
)
from xarray.core.indexes import Index, PandasIndex, filter_indexes_from_coords
from xarray.core.types import QueryEngineOptions, QueryParserOptions
from xarray.core.utils import is_scalar
from xarray.testing import _assert_internal_invariants
Expand Down Expand Up @@ -749,6 +745,16 @@ def test_getitem_empty_index(self) -> None:
)
assert_identical(da[[]], DataArray(np.zeros((0, 4)), dims=["x", "y"]))

def test_getitem_typeerror(self) -> None:
with pytest.raises(TypeError, match=r"unexpected indexer type"):
self.dv[True]
with pytest.raises(TypeError, match=r"unexpected indexer type"):
self.dv[np.array(True)]
with pytest.raises(TypeError, match=r"invalid indexer array"):
self.dv[3.0]
with pytest.raises(TypeError, match=r"invalid indexer array"):
self.dv[None]

def test_setitem(self) -> None:
# basic indexing should work as numpy's indexing
tuples: list[tuple[int | list[int] | slice, int | list[int] | slice]] = [
Expand Down
4 changes: 4 additions & 0 deletions xarray/tests/test_indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,10 @@ def test_invalid_for_all(indexer_cls) -> None:
indexer_cls((slice("foo"),))
with pytest.raises(TypeError):
indexer_cls((np.array(["foo"]),))
with pytest.raises(TypeError):
indexer_cls(True)
with pytest.raises(TypeError):
indexer_cls(np.array(True))


def check_integer(indexer_cls):
Expand Down
Loading