From a8bcd0fa74048172f6cd311c9875de29617db821 Mon Sep 17 00:00:00 2001 From: Eric Hansen Date: Mon, 2 Mar 2020 21:18:08 -0500 Subject: [PATCH 1/2] BUG: Replace isinstance with issubclass in _ensure_type (#31925) Commit pandas-dev/pandas@6fd326d5a249967f9b6be60fc3c5f7366d914684 in pull request pandas-dev/pandas#30613 added `_ensure_type`, which utilizes `isinstance`. However, it is reasonable to assume that someone may want to create a DataFrame subclass. Therefore, `_ensure_type` should use `issubclass`. --- pandas/core/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/base.py b/pandas/core/base.py index f55d9f905945d..40ca70ec7973a 100644 --- a/pandas/core/base.py +++ b/pandas/core/base.py @@ -93,7 +93,7 @@ def _ensure_type(self: T, obj) -> T: Used by type checkers. """ - assert isinstance(obj, type(self)), type(obj) + assert issubclass(type(obj), type(self)), type(obj) return obj From 5ddbea941758df576e5c513764134c2f6a8583eb Mon Sep 17 00:00:00 2001 From: Eric Hansen Date: Tue, 3 Mar 2020 13:01:51 -0500 Subject: [PATCH 2/2] TST: Added tests for pandas object ensure type (#31925) --- pandas/tests/base/test_base.py | 38 ++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 pandas/tests/base/test_base.py diff --git a/pandas/tests/base/test_base.py b/pandas/tests/base/test_base.py new file mode 100644 index 0000000000000..22eb4f03653f6 --- /dev/null +++ b/pandas/tests/base/test_base.py @@ -0,0 +1,38 @@ +import pytest + +from pandas.core.base import PandasObject + +pandas_object = PandasObject() + + +class SubclassPandasObject(PandasObject): + pass + + +subclass_pandas_object = SubclassPandasObject() + + +@pytest.mark.parametrize("other_object", [pandas_object, subclass_pandas_object]) +def test_pandas_object_ensure_type(other_object): + pandas_object = PandasObject() + assert pandas_object._ensure_type(other_object) + + +def test_pandas_object_ensure_type_for_same_object(): + pandas_object_a = PandasObject() + pandas_object_b = pandas_object_a + assert pandas_object_a._ensure_type(pandas_object_b) + + +class OtherClass: + pass + + +other_class = OtherClass() + + +@pytest.mark.parametrize("other_object", [other_class]) +def test_pandas_object_ensure_type_for_false(other_object): + pandas_object = PandasObject() + with pytest.raises(AssertionError): + assert pandas_object._ensure_type(other_object)