Skip to content

Commit 649f052

Browse files
move getitem_returns_view from method to helper function
1 parent 3fcc02f commit 649f052

File tree

9 files changed

+51
-28
lines changed

9 files changed

+51
-28
lines changed

pandas/core/arrays/_mixins.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@
5454
from pandas.core.array_algos.transforms import shift
5555
from pandas.core.arrays.base import ExtensionArray
5656
from pandas.core.construction import extract_array
57-
from pandas.core.indexers import check_array_indexer
57+
from pandas.core.indexers import (
58+
check_array_indexer,
59+
getitem_returns_view,
60+
)
5861
from pandas.core.sorting import nargminmax
5962

6063
if TYPE_CHECKING:
@@ -287,7 +290,7 @@ def __getitem__(
287290
if self.ndim == 1:
288291
return self._box_func(result)
289292
result = self._from_backing_data(result)
290-
if self._getitem_returns_view(key):
293+
if getitem_returns_view(self, key):
291294
result._readonly = self._readonly
292295
return result
293296

@@ -300,7 +303,7 @@ def __getitem__(
300303
return self._box_func(result)
301304

302305
result = self._from_backing_data(result)
303-
if self._getitem_returns_view(key):
306+
if getitem_returns_view(self, key):
304307
result._readonly = self._readonly
305308
return result
306309

pandas/core/arrays/arrow/array.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
from pandas.core.construction import extract_array
7979
from pandas.core.indexers import (
8080
check_array_indexer,
81+
getitem_returns_view,
8182
unpack_tuple_and_ellipses,
8283
validate_indices,
8384
)
@@ -791,7 +792,7 @@ def __getitem__(self, item: PositionalIndexer):
791792
value = self._pa_array[item]
792793
if isinstance(value, pa.ChunkedArray):
793794
result = self._from_pyarrow_array(value)
794-
if self._getitem_returns_view(item):
795+
if getitem_returns_view(self, item):
795796
result._readonly = self._readonly
796797
return result
797798
else:

pandas/core/arrays/base.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -433,22 +433,6 @@ def __getitem__(self, item: PositionalIndexer) -> Self | Any:
433433
"""
434434
raise AbstractMethodError(self)
435435

436-
def _getitem_returns_view(self, key) -> bool:
437-
if not isinstance(key, tuple):
438-
key = (key,)
439-
440-
# filter out Ellipsis and np.newaxis
441-
key = tuple(k for k in key if k is not Ellipsis and k is not np.newaxis)
442-
if not key:
443-
return True
444-
# single integer gives view if selecting subset of 2D array
445-
if self.ndim == 2 and lib.is_integer(key[0]):
446-
return True
447-
# slices always give views
448-
if all(isinstance(k, slice) for k in key):
449-
return True
450-
return False
451-
452436
def __setitem__(self, key, value) -> None:
453437
"""
454438
Set one or more values inplace.

pandas/core/arrays/interval.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@
8787
ensure_wrapped_if_datetimelike,
8888
extract_array,
8989
)
90-
from pandas.core.indexers import check_array_indexer
90+
from pandas.core.indexers import (
91+
check_array_indexer,
92+
getitem_returns_view,
93+
)
9194
from pandas.core.ops import (
9295
invalid_comparison,
9396
unpack_zerodim_and_defer,
@@ -843,7 +846,7 @@ def __getitem__(self, key: PositionalIndexer) -> Self | IntervalOrNA:
843846
# ndarray[Any, Any]]"; expected "Union[Union[DatetimeArray, TimedeltaArray],
844847
# ndarray[Any, Any]]"
845848
result = self._simple_new(left, right, dtype=self.dtype) # type: ignore[arg-type]
846-
if self._getitem_returns_view(key):
849+
if getitem_returns_view(self, key):
847850
result._readonly = self._readonly
848851
return result
849852

pandas/core/arrays/masked.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@
7676
ensure_wrapped_if_datetimelike,
7777
extract_array,
7878
)
79-
from pandas.core.indexers import check_array_indexer
79+
from pandas.core.indexers import (
80+
check_array_indexer,
81+
getitem_returns_view,
82+
)
8083
from pandas.core.ops import invalid_comparison
8184
from pandas.core.util.hashing import hash_array
8285

@@ -214,7 +217,7 @@ def __getitem__(self, item: PositionalIndexer) -> Self | Any:
214217
return self._data[item]
215218

216219
result = self._simple_new(self._data[item], newmask)
217-
if self._getitem_returns_view(item):
220+
if getitem_returns_view(self, item):
218221
result._readonly = self._readonly
219222
return result
220223

pandas/core/indexers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
check_key_length,
44
check_setitem_lengths,
55
disallow_ndim_indexing,
6+
getitem_returns_view,
67
is_empty_indexer,
78
is_list_like_indexer,
89
is_scalar_indexer,
@@ -19,6 +20,7 @@
1920
"check_key_length",
2021
"check_setitem_lengths",
2122
"disallow_ndim_indexing",
23+
"getitem_returns_view",
2224
"is_empty_indexer",
2325
"is_list_like_indexer",
2426
"is_scalar_indexer",

pandas/core/indexers/utils.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,27 @@ def unpack_tuple_and_ellipses(item: tuple):
414414
return item
415415

416416

417+
def getitem_returns_view(arr, key) -> bool:
418+
"""
419+
Check if an ``arr.__getitem__`` call with given ``key`` would return a view
420+
or not.
421+
"""
422+
if not isinstance(key, tuple):
423+
key = (key,)
424+
425+
# filter out Ellipsis and np.newaxis
426+
key = tuple(k for k in key if k is not Ellipsis and k is not np.newaxis)
427+
if not key:
428+
return True
429+
# single integer gives view if selecting subset of 2D array
430+
if arr.ndim == 2 and lib.is_integer(key[0]):
431+
return True
432+
# slices always give views
433+
if all(isinstance(k, slice) for k in key):
434+
return True
435+
return False
436+
437+
417438
# -----------------------------------------------------------
418439
# Public indexer validation
419440

pandas/tests/extension/decimal/array.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
ExtensionArray,
3131
ExtensionScalarOpsMixin,
3232
)
33-
from pandas.core.indexers import check_array_indexer
33+
from pandas.core.indexers import (
34+
check_array_indexer,
35+
getitem_returns_view,
36+
)
3437

3538
if TYPE_CHECKING:
3639
from pandas._typing import type_t
@@ -178,7 +181,7 @@ def __getitem__(self, item):
178181
# array, slice.
179182
item = pd.api.indexers.check_array_indexer(self, item)
180183
result = type(self)(self._data[item])
181-
if self._getitem_returns_view(item):
184+
if getitem_returns_view(self, item):
182185
result._readonly = self._readonly
183186
return result
184187

pandas/tests/extension/json/array.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@
4141
ExtensionArray,
4242
ExtensionDtype,
4343
)
44-
from pandas.core.indexers import unpack_tuple_and_ellipses
44+
from pandas.core.indexers import (
45+
getitem_returns_view,
46+
unpack_tuple_and_ellipses,
47+
)
4548

4649
if TYPE_CHECKING:
4750
from collections.abc import Mapping
@@ -111,7 +114,7 @@ def __getitem__(self, item):
111114
elif isinstance(item, slice):
112115
# slice
113116
result = type(self)(self.data[item])
114-
if self._getitem_returns_view(item):
117+
if getitem_returns_view(self, item):
115118
result._readonly = self._readonly
116119
return result
117120
elif not is_list_like(item):

0 commit comments

Comments
 (0)