From 453875e78e5d0f1d39104229b6996d403088eecb Mon Sep 17 00:00:00 2001 From: makbigc Date: Mon, 27 May 2019 15:35:08 +0800 Subject: [PATCH 1/8] Add typing annotation to assert_index_equal --- pandas/util/testing.py | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 92d450140a891..2aec9aae0a87c 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -12,6 +12,7 @@ import string import tempfile import traceback +from typing import Union import warnings import zipfile @@ -515,9 +516,14 @@ def equalContents(arr1, arr2): return frozenset(arr1) == frozenset(arr2) -def assert_index_equal(left, right, exact='equiv', check_names=True, - check_less_precise=False, check_exact=True, - check_categorical=True, obj='Index'): +def assert_index_equal(left: Index, + right: Index, + exact: Union[bool, str] = 'equiv', + check_names: bool = True, + check_less_precise: Union[bool, int] = False, + check_exact: bool = True, + check_categorical=True, + obj: str = 'Index'): """Check that left and right Index are equal. Parameters @@ -587,19 +593,20 @@ def _get_ilevel_values(index, level): raise_assert_detail(obj, msg1, msg2, msg3) # MultiIndex special comparison for little-friendly error messages - if left.nlevels > 1: - for level in range(left.nlevels): - # cannot use get_level_values here because it can change dtype - llevel = _get_ilevel_values(left, level) - rlevel = _get_ilevel_values(right, level) - - lobj = 'MultiIndex level [{level}]'.format(level=level) - assert_index_equal(llevel, rlevel, - exact=exact, check_names=check_names, - check_less_precise=check_less_precise, - check_exact=check_exact, obj=lobj) - # get_level_values may change dtype - _check_types(left.levels[level], right.levels[level], obj=obj) + if isinstance(left, MultiIndex) and isinstance(right, MultiIndex): + if left.nlevels > 1: + for level in range(left.nlevels): + # cannot use get_level_values here because it can change dtype + llevel = _get_ilevel_values(left, level) + rlevel = _get_ilevel_values(right, level) + + lobj = 'MultiIndex level [{level}]'.format(level=level) + assert_index_equal(llevel, rlevel, + exact=exact, check_names=check_names, + check_less_precise=check_less_precise, + check_exact=check_exact, obj=lobj) + # get_level_values may change dtype + _check_types(left.levels[level], right.levels[level], obj=obj) # skip exact index checking when `check_categorical` is False if check_exact and check_categorical: From 8c70a151819bc45daba725f6c406b8d1a828ae57 Mon Sep 17 00:00:00 2001 From: makbigc Date: Tue, 28 May 2019 21:40:37 +0800 Subject: [PATCH 2/8] Add annotation to the parameter check_categorical --- pandas/util/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 2aec9aae0a87c..bc0bb9937a551 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -522,7 +522,7 @@ def assert_index_equal(left: Index, check_names: bool = True, check_less_precise: Union[bool, int] = False, check_exact: bool = True, - check_categorical=True, + check_categorical: bool = True, obj: str = 'Index'): """Check that left and right Index are equal. From 411dd5171b096ba2a998d30cab6b3f6d672dadfa Mon Sep 17 00:00:00 2001 From: makbigc Date: Thu, 30 May 2019 23:24:47 +0800 Subject: [PATCH 3/8] Add None to the typing annotation of assert_index_equal --- pandas/util/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index bc0bb9937a551..46c7c3b80c7a5 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -523,7 +523,7 @@ def assert_index_equal(left: Index, check_less_precise: Union[bool, int] = False, check_exact: bool = True, check_categorical: bool = True, - obj: str = 'Index'): + obj: str = 'Index') -> None: """Check that left and right Index are equal. Parameters From fe9f8e82107f0cdeea84810f0d8167928a64b92f Mon Sep 17 00:00:00 2001 From: makbigc Date: Mon, 3 Jun 2019 21:41:23 +0800 Subject: [PATCH 4/8] Cast left and right Index as MultiIndex and set None optional --- pandas/util/testing.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 46c7c3b80c7a5..1ab21f8d73375 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -12,7 +12,7 @@ import string import tempfile import traceback -from typing import Union +from typing import cast, Union, Optional import warnings import zipfile @@ -523,7 +523,7 @@ def assert_index_equal(left: Index, check_less_precise: Union[bool, int] = False, check_exact: bool = True, check_categorical: bool = True, - obj: str = 'Index') -> None: + obj: str = 'Index') -> Optional[None]: """Check that left and right Index are equal. Parameters @@ -593,20 +593,21 @@ def _get_ilevel_values(index, level): raise_assert_detail(obj, msg1, msg2, msg3) # MultiIndex special comparison for little-friendly error messages - if isinstance(left, MultiIndex) and isinstance(right, MultiIndex): - if left.nlevels > 1: - for level in range(left.nlevels): - # cannot use get_level_values here because it can change dtype - llevel = _get_ilevel_values(left, level) - rlevel = _get_ilevel_values(right, level) - - lobj = 'MultiIndex level [{level}]'.format(level=level) - assert_index_equal(llevel, rlevel, - exact=exact, check_names=check_names, - check_less_precise=check_less_precise, - check_exact=check_exact, obj=lobj) - # get_level_values may change dtype - _check_types(left.levels[level], right.levels[level], obj=obj) + if left.nlevels > 1: + for level in range(left.nlevels): + # cannot use get_level_values here because it can change dtype + llevel = _get_ilevel_values(left, level) + rlevel = _get_ilevel_values(right, level) + + lobj = 'MultiIndex level [{level}]'.format(level=level) + assert_index_equal(llevel, rlevel, + exact=exact, check_names=check_names, + check_less_precise=check_less_precise, + check_exact=check_exact, obj=lobj) + # get_level_values may change dtype + left = cast(MultiIndex, left) + right = cast(MultiIndex, right) + _check_types(left.levels[level], right.levels[level], obj=obj) # skip exact index checking when `check_categorical` is False if check_exact and check_categorical: From 571e64f81f570d4b7754b40fc124bc01f9c1c9a6 Mon Sep 17 00:00:00 2001 From: makbigc Date: Mon, 3 Jun 2019 22:26:13 +0800 Subject: [PATCH 5/8] isort pandas/util/testing.py --- pandas/util/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 1ab21f8d73375..cd25022a83eec 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -12,7 +12,7 @@ import string import tempfile import traceback -from typing import cast, Union, Optional +from typing import Optional, Union, cast import warnings import zipfile From 904a7f26576cc01d96751847fe3ec055140b9ec3 Mon Sep 17 00:00:00 2001 From: makbigc Date: Tue, 4 Jun 2019 22:11:19 +0800 Subject: [PATCH 6/8] Move the casting statement up --- pandas/util/testing.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index cd25022a83eec..66e873e7d8ed2 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -594,6 +594,9 @@ def _get_ilevel_values(index, level): # MultiIndex special comparison for little-friendly error messages if left.nlevels > 1: + left = cast(MultiIndex, left) + right = cast(MultiIndex, right) + for level in range(left.nlevels): # cannot use get_level_values here because it can change dtype llevel = _get_ilevel_values(left, level) @@ -605,8 +608,6 @@ def _get_ilevel_values(index, level): check_less_precise=check_less_precise, check_exact=check_exact, obj=lobj) # get_level_values may change dtype - left = cast(MultiIndex, left) - right = cast(MultiIndex, right) _check_types(left.levels[level], right.levels[level], obj=obj) # skip exact index checking when `check_categorical` is False From 7de3444d15911c5d207166a7ccef58f0fe279074 Mon Sep 17 00:00:00 2001 From: makbigc Date: Tue, 4 Jun 2019 23:29:07 +0800 Subject: [PATCH 7/8] None as the return type of assert_index_equal --- pandas/util/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index 66e873e7d8ed2..b71f1de9ae7cf 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -523,7 +523,7 @@ def assert_index_equal(left: Index, check_less_precise: Union[bool, int] = False, check_exact: bool = True, check_categorical: bool = True, - obj: str = 'Index') -> Optional[None]: + obj: str = 'Index') -> None: """Check that left and right Index are equal. Parameters From cf96e227ad6001c31a13aab291771cb2fac8f188 Mon Sep 17 00:00:00 2001 From: makbigc Date: Wed, 5 Jun 2019 00:50:55 +0800 Subject: [PATCH 8/8] Fix linting error --- pandas/util/testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/util/testing.py b/pandas/util/testing.py index b71f1de9ae7cf..107c17c5253fb 100644 --- a/pandas/util/testing.py +++ b/pandas/util/testing.py @@ -12,7 +12,7 @@ import string import tempfile import traceback -from typing import Optional, Union, cast +from typing import Union, cast import warnings import zipfile