From 6b33bda310c7d5518f0d8a4bae59d519bdd3d2ab Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 10 Feb 2020 12:59:13 -0800 Subject: [PATCH 1/3] is_integer() -> is_integer_dtype --- pandas/core/indexes/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index ff026583c5adb..8a1d37626420f 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3176,7 +3176,7 @@ def is_int(v): is_null_slicer = start is None and stop is None is_index_slice = is_int(start) and is_int(stop) is_positional = is_index_slice and not ( - self.is_integer() or self.is_categorical() + is_integer_dtype(self.dtype) or self.is_categorical() ) if kind == "getitem": @@ -3184,7 +3184,7 @@ def is_int(v): called from the getitem slicers, validate that we are in fact integers """ - if self.is_integer() or is_index_slice: + if is_integer_dtype(self.dtype) or is_index_slice: self._validate_indexer("slice", key.start, "getitem") self._validate_indexer("slice", key.stop, "getitem") self._validate_indexer("slice", key.step, "getitem") From 2a82c2ee05b6f2b0d99995a07645bb32196137bc Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 10 Feb 2020 18:23:46 -0800 Subject: [PATCH 2/3] catch almost-null-slice --- pandas/core/indexes/base.py | 5 ++--- pandas/tests/indexes/test_base.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index d5787100e87ef..20465cc9fee67 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3173,8 +3173,7 @@ def _convert_slice_indexer(self, key: slice, kind: str_t): def is_int(v): return v is None or is_integer(v) - is_null_slicer = start is None and stop is None - is_index_slice = is_int(start) and is_int(stop) + is_index_slice = is_int(start) and is_int(stop) and is_int(step) is_positional = is_index_slice and not ( is_integer_dtype(self.dtype) or self.is_categorical() ) @@ -3204,7 +3203,7 @@ def is_int(v): except KeyError: pass - if is_null_slicer: + if com.is_null_slice(key): indexer = key elif is_positional: indexer = key diff --git a/pandas/tests/indexes/test_base.py b/pandas/tests/indexes/test_base.py index 04af9b09bbf89..574d7b4960afe 100644 --- a/pandas/tests/indexes/test_base.py +++ b/pandas/tests/indexes/test_base.py @@ -2764,3 +2764,18 @@ def test_validate_1d_input(): ser = pd.Series(0, range(4)) with pytest.raises(ValueError, match=msg): ser.index = np.array([[2, 3]] * 4) + + +def test_convert_almost_null_slice(indices): + # slice with None at both ends, but not step + idx = indices + + key = slice(None, None, "foo") + + if isinstance(idx, pd.IntervalIndex): + with pytest.raises(ValueError, match="cannot support not-default step"): + idx._convert_slice_indexer(key, "loc") + else: + msg = "'>=' not supported between instances of 'str' and 'int'" + with pytest.raises(TypeError, match=msg): + idx._convert_slice_indexer(key, "loc") From 4f2f5d98bdfd872b6b58a86f0e51b7b398905c33 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 10 Feb 2020 18:25:10 -0800 Subject: [PATCH 3/3] remove unrelated --- pandas/core/indexes/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 20465cc9fee67..f833c0146d043 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3175,7 +3175,7 @@ def is_int(v): is_index_slice = is_int(start) and is_int(stop) and is_int(step) is_positional = is_index_slice and not ( - is_integer_dtype(self.dtype) or self.is_categorical() + self.is_integer() or self.is_categorical() ) if kind == "getitem": @@ -3183,7 +3183,7 @@ def is_int(v): called from the getitem slicers, validate that we are in fact integers """ - if is_integer_dtype(self.dtype) or is_index_slice: + if self.is_integer() or is_index_slice: self._validate_indexer("slice", key.start, "getitem") self._validate_indexer("slice", key.stop, "getitem") self._validate_indexer("slice", key.step, "getitem")