From 3ffbc78ab3f12bb702f1aa77bf165732e636fd35 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Tue, 2 Mar 2021 16:22:00 +0000 Subject: [PATCH 1/7] try typing set_axis --- pandas/core/frame.py | 23 +++++++++++++++++++++-- pandas/core/generic.py | 21 ++++++++++++++++++++- pandas/core/series.py | 26 ++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 830a7f4347132..ef3d5dfaa63e4 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4407,6 +4407,18 @@ def align( broadcast_axis=broadcast_axis, ) + @overload + # https://github.com/python/mypy/issues/6580 + # Overloaded function signatures 1 and 2 overlap with incompatible return types + def set_axis( # type: ignore[misc] + self, labels, axis: Axis = ..., inplace: Literal[False] = ... + ) -> DataFrame: + ... + + @overload + def set_axis(self, labels, axis: Axis = ..., inplace: Literal[True] = ...) -> None: + ... + @Appender( """ Examples @@ -4446,8 +4458,15 @@ def align( see_also_sub=" or columns", ) @Appender(NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): - return super().set_axis(labels, axis=axis, inplace=inplace) + # Signature of "set_axis" incompatible with supertype "NDFrame" + def set_axis( # type: ignore[override] + self, labels, axis: Axis = 0, inplace: bool = False + ) -> Optional[DataFrame]: + # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", + # "Union[str, int]", "bool" + return super().set_axis( # type: ignore[call-overload] + labels, axis=axis, inplace=inplace + ) @Substitution(**_shared_doc_kwargs) @Appender(NDFrame.reindex.__doc__) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 4774045849eb6..6d0309d2ede78 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -24,6 +24,7 @@ Type, Union, cast, + overload, ) import warnings import weakref @@ -159,6 +160,8 @@ from pandas.io.formats.printing import pprint_thing if TYPE_CHECKING: + from typing import Literal + from pandas._libs.tslibs import BaseOffset from pandas.core.frame import DataFrame @@ -662,7 +665,23 @@ def _obj_with_exclusions(self: FrameOrSeries) -> FrameOrSeries: """ internal compat with SelectionMixin """ return self - def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): + @overload + # https://github.com/python/mypy/issues/6580 + # Overloaded function signatures 1 and 2 overlap with incompatible return types + def set_axis( # type: ignore[misc] + self: FrameOrSeries, labels, axis: Axis = ..., inplace: Literal[False] = ... + ) -> FrameOrSeries: + ... + + @overload + def set_axis( + self: FrameOrSeries, labels, axis: Axis = ..., inplace: Literal[True] = ... + ) -> None: + ... + + def set_axis( + self: FrameOrSeries, labels, axis: Axis = 0, inplace: bool_t = False + ) -> Optional[FrameOrSeries]: """ Assign desired index to given axis. diff --git a/pandas/core/series.py b/pandas/core/series.py index b2e620c9b8047..6f807ea63e315 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -20,6 +20,7 @@ Type, Union, cast, + overload, ) import warnings @@ -138,6 +139,8 @@ import pandas.plotting if TYPE_CHECKING: + from typing import Literal + from pandas._typing import ( TimedeltaConvertibleTypes, TimestampConvertibleTypes, @@ -4294,6 +4297,18 @@ def rename( else: return self._set_name(index, inplace=inplace) + @overload + # https://github.com/python/mypy/issues/6580 + # Overloaded function signatures 1 and 2 overlap with incompatible return types + def set_axis( # type: ignore[misc] + self, labels, axis: Axis = ..., inplace: Literal[False] = ... + ) -> Series: + ... + + @overload + def set_axis(self, labels, axis: Axis = ..., inplace: Literal[True] = ...) -> None: + ... + @Appender( """ Examples @@ -4319,8 +4334,15 @@ def rename( see_also_sub="", ) @Appender(generic.NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): - return super().set_axis(labels, axis=axis, inplace=inplace) + # Signature of "set_axis" incompatible with supertype "NDFrame" + def set_axis( # type: ignore[override] + self, labels, axis: Axis = 0, inplace: bool = False + ) -> Optional[Series]: + # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", + # "Union[str, int]", "bool" + return super().set_axis( # type: ignore[call-overload] + labels, axis=axis, inplace=inplace + ) @doc( NDFrame.reindex, From 1024cec0855b93a463dee8b3a106bebf7f3da9df Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Wed, 3 Mar 2021 17:04:17 +0000 Subject: [PATCH 2/7] fixup overloads --- pandas/core/frame.py | 10 ++++++---- pandas/core/generic.py | 10 ++++++---- pandas/core/series.py | 10 ++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index ef3d5dfaa63e4..b6c47966ee4bd 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4408,15 +4408,17 @@ def align( ) @overload - # https://github.com/python/mypy/issues/6580 - # Overloaded function signatures 1 and 2 overlap with incompatible return types - def set_axis( # type: ignore[misc] + def set_axis( self, labels, axis: Axis = ..., inplace: Literal[False] = ... ) -> DataFrame: ... @overload - def set_axis(self, labels, axis: Axis = ..., inplace: Literal[True] = ...) -> None: + def set_axis(self, labels, axis: Axis, inplace: Literal[True]) -> None: + ... + + @overload + def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... @Appender( diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 6d0309d2ede78..cc8cf928ed2ad 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -666,19 +666,21 @@ def _obj_with_exclusions(self: FrameOrSeries) -> FrameOrSeries: return self @overload - # https://github.com/python/mypy/issues/6580 - # Overloaded function signatures 1 and 2 overlap with incompatible return types - def set_axis( # type: ignore[misc] + def set_axis( self: FrameOrSeries, labels, axis: Axis = ..., inplace: Literal[False] = ... ) -> FrameOrSeries: ... @overload def set_axis( - self: FrameOrSeries, labels, axis: Axis = ..., inplace: Literal[True] = ... + self: FrameOrSeries, labels, axis: Axis, inplace: Literal[True] ) -> None: ... + @overload + def set_axis(self: FrameOrSeries, labels, *, inplace: Literal[True]) -> None: + ... + def set_axis( self: FrameOrSeries, labels, axis: Axis = 0, inplace: bool_t = False ) -> Optional[FrameOrSeries]: diff --git a/pandas/core/series.py b/pandas/core/series.py index 6f807ea63e315..47183f64e52dd 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4298,15 +4298,17 @@ def rename( return self._set_name(index, inplace=inplace) @overload - # https://github.com/python/mypy/issues/6580 - # Overloaded function signatures 1 and 2 overlap with incompatible return types - def set_axis( # type: ignore[misc] + def set_axis( self, labels, axis: Axis = ..., inplace: Literal[False] = ... ) -> Series: ... @overload - def set_axis(self, labels, axis: Axis = ..., inplace: Literal[True] = ...) -> None: + def set_axis(self, labels, axis: Axis, inplace: Literal[True]) -> None: + ... + + @overload + def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... @Appender( From f25ce3902e58c0228637c108e2647c742a0ea9ba Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Wed, 3 Mar 2021 17:33:55 +0000 Subject: [PATCH 3/7] remove return type from base definition --- pandas/core/frame.py | 5 +---- pandas/core/generic.py | 4 +--- pandas/core/series.py | 5 +---- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index b6c47966ee4bd..54e28259fa408 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4460,10 +4460,7 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: see_also_sub=" or columns", ) @Appender(NDFrame.set_axis.__doc__) - # Signature of "set_axis" incompatible with supertype "NDFrame" - def set_axis( # type: ignore[override] - self, labels, axis: Axis = 0, inplace: bool = False - ) -> Optional[DataFrame]: + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", # "Union[str, int]", "bool" return super().set_axis( # type: ignore[call-overload] diff --git a/pandas/core/generic.py b/pandas/core/generic.py index cc8cf928ed2ad..9e691c581133d 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -681,9 +681,7 @@ def set_axis( def set_axis(self: FrameOrSeries, labels, *, inplace: Literal[True]) -> None: ... - def set_axis( - self: FrameOrSeries, labels, axis: Axis = 0, inplace: bool_t = False - ) -> Optional[FrameOrSeries]: + def set_axis(self: FrameOrSeries, labels, axis: Axis = 0, inplace: bool_t = False): """ Assign desired index to given axis. diff --git a/pandas/core/series.py b/pandas/core/series.py index 47183f64e52dd..5303505a8204f 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4336,10 +4336,7 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: see_also_sub="", ) @Appender(generic.NDFrame.set_axis.__doc__) - # Signature of "set_axis" incompatible with supertype "NDFrame" - def set_axis( # type: ignore[override] - self, labels, axis: Axis = 0, inplace: bool = False - ) -> Optional[Series]: + def set_axis(self: Series, labels, axis: Axis = 0, inplace: bool = False): # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", # "Union[str, int]", "bool" return super().set_axis( # type: ignore[call-overload] From 6ae9563595bad99e75c0bb9816245048af4544b8 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Wed, 3 Mar 2021 17:45:23 +0000 Subject: [PATCH 4/7] searching in the sun for another overload --- pandas/core/frame.py | 12 ++++++------ pandas/core/generic.py | 8 +++++++- pandas/core/series.py | 12 ++++++------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 54e28259fa408..35547cc59fd80 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4421,6 +4421,10 @@ def set_axis(self, labels, axis: Axis, inplace: Literal[True]) -> None: def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... + @overload + def set_axis(self, labels, axis: Axis, inplace: bool) -> Optional[DataFrame]: + ... + @Appender( """ Examples @@ -4460,12 +4464,8 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: see_also_sub=" or columns", ) @Appender(NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): - # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", - # "Union[str, int]", "bool" - return super().set_axis( # type: ignore[call-overload] - labels, axis=axis, inplace=inplace - ) + def set_axis(self, labels, axis=0, inplace=False): + return super().set_axis(labels, axis=axis, inplace=inplace) @Substitution(**_shared_doc_kwargs) @Appender(NDFrame.reindex.__doc__) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 9e691c581133d..ff923cb8cce0f 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -681,7 +681,13 @@ def set_axis( def set_axis(self: FrameOrSeries, labels, *, inplace: Literal[True]) -> None: ... - def set_axis(self: FrameOrSeries, labels, axis: Axis = 0, inplace: bool_t = False): + @overload + def set_axis( + self: FrameOrSeries, labels, axis: Axis, inplace: bool_t + ) -> Optional[FrameOrSeries]: + ... + + def set_axis(self, labels, axis=0, inplace=False): """ Assign desired index to given axis. diff --git a/pandas/core/series.py b/pandas/core/series.py index 5303505a8204f..cdf788cc70ecf 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4311,6 +4311,10 @@ def set_axis(self, labels, axis: Axis, inplace: Literal[True]) -> None: def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... + @overload + def set_axis(self, labels, axis: Axis, inplace: bool) -> Optional[Series]: + ... + @Appender( """ Examples @@ -4336,12 +4340,8 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: see_also_sub="", ) @Appender(generic.NDFrame.set_axis.__doc__) - def set_axis(self: Series, labels, axis: Axis = 0, inplace: bool = False): - # No overload variant of "set_axis" of "NDFrame" matches argument types "Any", - # "Union[str, int]", "bool" - return super().set_axis( # type: ignore[call-overload] - labels, axis=axis, inplace=inplace - ) + def set_axis(self, labels, axis=0, inplace=False): + return super().set_axis(labels, axis=axis, inplace=inplace) @doc( NDFrame.reindex, From 6f1f0df464d5318805bab42877943418bb3fdaf3 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Wed, 3 Mar 2021 17:48:47 +0000 Subject: [PATCH 5/7] bool --- pandas/core/generic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index ff923cb8cce0f..6509a34b636e8 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -683,7 +683,7 @@ def set_axis(self: FrameOrSeries, labels, *, inplace: Literal[True]) -> None: @overload def set_axis( - self: FrameOrSeries, labels, axis: Axis, inplace: bool_t + self: FrameOrSeries, labels, axis: Axis, inplace: bool ) -> Optional[FrameOrSeries]: ... From f4cf880fbc546a0a40f49c993faad475bd5139c9 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Thu, 4 Mar 2021 11:48:50 +0000 Subject: [PATCH 6/7] allow defaults in bool case --- pandas/core/frame.py | 4 +++- pandas/core/generic.py | 2 +- pandas/core/series.py | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 35547cc59fd80..61a81e02909c3 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4422,7 +4422,9 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... @overload - def set_axis(self, labels, axis: Axis, inplace: bool) -> Optional[DataFrame]: + def set_axis( + self, labels, axis: Axis = ..., inplace: bool = ... + ) -> Optional[DataFrame]: ... @Appender( diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 6509a34b636e8..e7d882f2d6899 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -683,7 +683,7 @@ def set_axis(self: FrameOrSeries, labels, *, inplace: Literal[True]) -> None: @overload def set_axis( - self: FrameOrSeries, labels, axis: Axis, inplace: bool + self: FrameOrSeries, labels, axis: Axis = ..., inplace: bool = ... ) -> Optional[FrameOrSeries]: ... diff --git a/pandas/core/series.py b/pandas/core/series.py index cdf788cc70ecf..e14bb0c8a8d36 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4312,7 +4312,9 @@ def set_axis(self, labels, *, inplace: Literal[True]) -> None: ... @overload - def set_axis(self, labels, axis: Axis, inplace: bool) -> Optional[Series]: + def set_axis( + self, labels, axis: Axis = ..., inplace: bool = ... + ) -> Optional[Series]: ... @Appender( From 86e116df642b229d9986ed372013974489c91c25 Mon Sep 17 00:00:00 2001 From: Marco Gorelli Date: Tue, 9 Mar 2021 19:11:13 +0000 Subject: [PATCH 7/7] type non-overloaded arguments --- pandas/core/frame.py | 2 +- pandas/core/generic.py | 2 +- pandas/core/series.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 61a81e02909c3..3918b3154088f 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4466,7 +4466,7 @@ def set_axis( see_also_sub=" or columns", ) @Appender(NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): return super().set_axis(labels, axis=axis, inplace=inplace) @Substitution(**_shared_doc_kwargs) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index e7d882f2d6899..4569efd9ce090 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -687,7 +687,7 @@ def set_axis( ) -> Optional[FrameOrSeries]: ... - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): """ Assign desired index to given axis. diff --git a/pandas/core/series.py b/pandas/core/series.py index e14bb0c8a8d36..9089abe39c4e7 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -4342,7 +4342,7 @@ def set_axis( see_also_sub="", ) @Appender(generic.NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): return super().set_axis(labels, axis=axis, inplace=inplace) @doc(