From 71bff81912a33c5e0cbd37edeceaab4ed4012d80 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 3 Oct 2022 00:11:48 +0100 Subject: [PATCH 1/3] Fix assert_almost_equal, add test --- pandas/_libs/testing.pyx | 6 +++++- pandas/tests/dtypes/test_inference.py | 2 ++ pandas/tests/util/test_assert_almost_equal.py | 12 ++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pandas/_libs/testing.pyx b/pandas/_libs/testing.pyx index 679cde9932a7a..5a68641e35f45 100644 --- a/pandas/_libs/testing.pyx +++ b/pandas/_libs/testing.pyx @@ -21,7 +21,11 @@ from pandas.core.dtypes.missing import ( cdef bint isiterable(obj): - return hasattr(obj, '__iter__') + if hasattr(obj, '__iter__'): + if hasattr(obj, "ndim") and obj.ndim == 0: + return False + return True + return False cdef bint has_length(obj): diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index 46bc6d82b55db..70bff3c2de962 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -126,6 +126,8 @@ def size(self): def shape(self): return self._values.shape + def __getitem__(self, item): + return self._values[item] # collect all objects to be tested for list-like-ness; use tuples of objects, # whether they are list-like or not (special casing for sets), and their ID diff --git a/pandas/tests/util/test_assert_almost_equal.py b/pandas/tests/util/test_assert_almost_equal.py index ab53707771be6..f8279a902e54b 100644 --- a/pandas/tests/util/test_assert_almost_equal.py +++ b/pandas/tests/util/test_assert_almost_equal.py @@ -8,6 +8,7 @@ Timestamp, ) import pandas._testing as tm +from pandas.tests.dtypes.test_inference import MockNumpyLikeArray def _assert_almost_equal_both(a, b, **kwargs): @@ -458,3 +459,14 @@ def test_assert_almost_equal_iterable_values_mismatch(): with pytest.raises(AssertionError, match=msg): tm.assert_almost_equal([1, 2], [1, 3]) + +@pytest.mark.parametrize( + "obj,description", + [ + (MockNumpyLikeArray(np.ndarray((2,) * 1)), "duck-ndarray-1d"), + (MockNumpyLikeArray(np.array([])), "duck-ndarray-1d-empty"), + (MockNumpyLikeArray(np.array(2)), "duck-ndarray-0d"), + ], +) +def test_assert_almost_equal_not_iterable(obj, description): + tm.assert_almost_equal(obj, obj) From 9840d3112d5de565d8b5c169c7ee7bb889446e61 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 3 Oct 2022 10:32:37 +0100 Subject: [PATCH 2/3] lint --- pandas/tests/dtypes/test_inference.py | 1 + pandas/tests/util/test_assert_almost_equal.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index 70bff3c2de962..cc492eacdd550 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -129,6 +129,7 @@ def shape(self): def __getitem__(self, item): return self._values[item] + # collect all objects to be tested for list-like-ness; use tuples of objects, # whether they are list-like or not (special casing for sets), and their ID ll_params = [ diff --git a/pandas/tests/util/test_assert_almost_equal.py b/pandas/tests/util/test_assert_almost_equal.py index f8279a902e54b..787adfdf90d5c 100644 --- a/pandas/tests/util/test_assert_almost_equal.py +++ b/pandas/tests/util/test_assert_almost_equal.py @@ -460,12 +460,13 @@ def test_assert_almost_equal_iterable_values_mismatch(): with pytest.raises(AssertionError, match=msg): tm.assert_almost_equal([1, 2], [1, 3]) + @pytest.mark.parametrize( "obj,description", [ - (MockNumpyLikeArray(np.ndarray((2,) * 1)), "duck-ndarray-1d"), - (MockNumpyLikeArray(np.array([])), "duck-ndarray-1d-empty"), - (MockNumpyLikeArray(np.array(2)), "duck-ndarray-0d"), + (MockNumpyLikeArray(np.ndarray((2,) * 1)), "duck-ndarray-1d"), + (MockNumpyLikeArray(np.array([])), "duck-ndarray-1d-empty"), + (MockNumpyLikeArray(np.array(2)), "duck-ndarray-0d"), ], ) def test_assert_almost_equal_not_iterable(obj, description): From 7380206bea99f3f5f87f8c7e83e8c67e63caf8b7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 4 Oct 2022 02:59:23 +0100 Subject: [PATCH 3/3] use try except --- pandas/_libs/testing.pyx | 6 ++++-- pandas/tests/util/test_assert_almost_equal.py | 11 ++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pandas/_libs/testing.pyx b/pandas/_libs/testing.pyx index 5a68641e35f45..a8cfbd558aa50 100644 --- a/pandas/_libs/testing.pyx +++ b/pandas/_libs/testing.pyx @@ -22,9 +22,11 @@ from pandas.core.dtypes.missing import ( cdef bint isiterable(obj): if hasattr(obj, '__iter__'): - if hasattr(obj, "ndim") and obj.ndim == 0: + try: + iter(obj) + return True + except (TypeError, IndexError) as e: return False - return True return False diff --git a/pandas/tests/util/test_assert_almost_equal.py b/pandas/tests/util/test_assert_almost_equal.py index 787adfdf90d5c..3384820631f48 100644 --- a/pandas/tests/util/test_assert_almost_equal.py +++ b/pandas/tests/util/test_assert_almost_equal.py @@ -462,12 +462,13 @@ def test_assert_almost_equal_iterable_values_mismatch(): @pytest.mark.parametrize( - "obj,description", + "obj", [ - (MockNumpyLikeArray(np.ndarray((2,) * 1)), "duck-ndarray-1d"), - (MockNumpyLikeArray(np.array([])), "duck-ndarray-1d-empty"), - (MockNumpyLikeArray(np.array(2)), "duck-ndarray-0d"), + MockNumpyLikeArray(np.ndarray((2,) * 1)), + MockNumpyLikeArray(np.array([])), + MockNumpyLikeArray(np.array(2)), ], + ids=["duck-ndarray-1d", "duck-ndarray-1d-empty", "duck-ndarray-0d"], ) -def test_assert_almost_equal_not_iterable(obj, description): +def test_assert_almost_equal_not_iterable(obj): tm.assert_almost_equal(obj, obj)