From ab452001b610b697ed14150f9d99ae1b3fcf225d Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Fri, 10 Jan 2020 11:17:35 -0800 Subject: [PATCH 1/2] raise earlier in RangeIndex.get_loc --- pandas/core/indexes/range.py | 17 ++++++++++------- pandas/tests/indexes/ranges/test_range.py | 7 ++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index b4cc71a25792f..510943ef22695 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -14,6 +14,7 @@ from pandas.core.dtypes.common import ( ensure_platform_int, ensure_python_int, + is_float, is_integer, is_integer_dtype, is_list_like, @@ -111,7 +112,7 @@ def __new__( return cls._simple_new(rng, dtype=dtype, name=name) @classmethod - def from_range(cls, data, name=None, dtype=None): + def from_range(cls, data: range, name=None, dtype=None): """ Create RangeIndex from a range object. @@ -344,12 +345,14 @@ def __contains__(self, key: Union[int, np.integer]) -> bool: @Appender(_index_shared_docs["get_loc"]) def get_loc(self, key, method=None, tolerance=None): - if is_integer(key) and method is None and tolerance is None: - new_key = int(key) - try: - return self._range.index(new_key) - except ValueError: - raise KeyError(key) + if method is None and tolerance is None: + if is_integer(key) or (is_float(key) and key.is_integer()): + new_key = int(key) + try: + return self._range.index(new_key) + except ValueError: + raise KeyError(key) + raise KeyError(key) return super().get_loc(key, method=method, tolerance=tolerance) @Appender(_index_shared_docs["get_indexer"]) diff --git a/pandas/tests/indexes/ranges/test_range.py b/pandas/tests/indexes/ranges/test_range.py index 8d98ab18963b6..0e5d1d45ad6db 100644 --- a/pandas/tests/indexes/ranges/test_range.py +++ b/pandas/tests/indexes/ranges/test_range.py @@ -735,8 +735,9 @@ def test_engineless_lookup(self): assert "_engine" not in idx._cache - # The engine is still required for lookup of a different dtype scalar: + # Different types of scalars can be excluded immediately, no need to + # use the _engine with pytest.raises(KeyError, match="'a'"): - assert idx.get_loc("a") == -1 + idx.get_loc("a") - assert "_engine" in idx._cache + assert "_engine" not in idx._cache From 4b5ba7e29f5b39de43076fe9a925ee43a7015ca5 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Fri, 10 Jan 2020 15:03:02 -0800 Subject: [PATCH 2/2] revert --- pandas/core/indexes/range.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 510943ef22695..5c79942efb908 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -112,7 +112,7 @@ def __new__( return cls._simple_new(rng, dtype=dtype, name=name) @classmethod - def from_range(cls, data: range, name=None, dtype=None): + def from_range(cls, data, name=None, dtype=None): """ Create RangeIndex from a range object.