From 94469ce4653a21ff61e92be32e168170696ab59f Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Thu, 2 Jan 2020 15:33:54 +0000 Subject: [PATCH 1/2] TYP: enable strict_equality to prohibit comparisons of non-overlapping types --- pandas/core/arrays/boolean.py | 14 +------------- pandas/core/arrays/period.py | 4 ++-- pandas/core/arrays/string_.py | 14 +------------- pandas/core/dtypes/base.py | 4 ++++ pandas/io/excel/_odfreader.py | 2 +- pandas/io/formats/format.py | 8 ++++---- setup.cfg | 1 + 7 files changed, 14 insertions(+), 33 deletions(-) diff --git a/pandas/core/arrays/boolean.py b/pandas/core/arrays/boolean.py index 7301c0ab434a0..3c3033fd8efb6 100644 --- a/pandas/core/arrays/boolean.py +++ b/pandas/core/arrays/boolean.py @@ -59,6 +59,7 @@ class BooleanDtype(ExtensionDtype): >>> pd.BooleanDtype() BooleanDtype """ + name = "boolean" @property def na_value(self) -> "Scalar": @@ -79,19 +80,6 @@ def type(self) -> Type: def kind(self) -> str: return "b" - @property - def name(self) -> str: - """ - The alias for BooleanDtype is ``'boolean'``. - """ - return "boolean" - - @classmethod - def construct_from_string(cls, string: str) -> ExtensionDtype: - if string == "boolean": - return cls() - return super().construct_from_string(string) - @classmethod def construct_array_type(cls) -> "Type[BooleanArray]": return BooleanArray diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 1eeb9ddc8e064..7d17ef825e6d9 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -320,7 +320,7 @@ def _check_compatible_with(self, other): def dtype(self): return self._dtype - # read-only property overwriting read/write + # error: Read-only property cannot override read-write property [misc] @property # type: ignore def freq(self): """ @@ -638,7 +638,7 @@ def _sub_period(self, other): return new_data def _addsub_int_array( - self, other: np.ndarray, op: Callable[[Any], Any], + self, other: np.ndarray, op: Callable[[Any, Any], Any], ) -> "PeriodArray": """ Add or subtract array of integers; equivalent to applying diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index de254f662bb32..dc57b28c167ac 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -46,6 +46,7 @@ class StringDtype(ExtensionDtype): >>> pd.StringDtype() StringDtype """ + name = "string" #: StringDtype.na_value uses pandas.NA na_value = libmissing.NA @@ -54,19 +55,6 @@ class StringDtype(ExtensionDtype): def type(self) -> Type: return str - @property - def name(self) -> str: - """ - The alias for StringDtype is ``'string'``. - """ - return "string" - - @classmethod - def construct_from_string(cls, string: str) -> ExtensionDtype: - if string == "string": - return cls() - return super().construct_from_string(string) - @classmethod def construct_array_type(cls) -> "Type[StringArray]": return StringArray diff --git a/pandas/core/dtypes/base.py b/pandas/core/dtypes/base.py index 4a06ea9500770..1b4e7062b38e5 100644 --- a/pandas/core/dtypes/base.py +++ b/pandas/core/dtypes/base.py @@ -236,6 +236,10 @@ def construct_from_string(cls, string: str): """ if not isinstance(string, str): raise TypeError(f"Expects a string, got {type(string).__name__}") + + # error: Non-overlapping equality check (left operand type: "str", right + # operand type: "Callable[[ExtensionDtype], str]") [comparison-overlap] + assert isinstance(cls.name, str), (cls, type(cls.name)) if string != cls.name: raise TypeError(f"Cannot construct a '{cls.__name__}' from '{string}'") return cls() diff --git a/pandas/io/excel/_odfreader.py b/pandas/io/excel/_odfreader.py index 2afb41e7bdc7e..ec5f6fcb17ff8 100644 --- a/pandas/io/excel/_odfreader.py +++ b/pandas/io/excel/_odfreader.py @@ -156,7 +156,7 @@ def _get_cell_value(self, cell, convert_float: bool) -> Scalar: # GH5394 cell_value = float(cell.attributes.get((OFFICENS, "value"))) - if cell_value == 0.0 and str(cell) != cell_value: # NA handling + if cell_value == 0.0: # NA handling return str(cell) if convert_float: diff --git a/pandas/io/formats/format.py b/pandas/io/formats/format.py index 1b18e0fc3f0fa..ea22999470102 100644 --- a/pandas/io/formats/format.py +++ b/pandas/io/formats/format.py @@ -231,7 +231,7 @@ def __init__( self, series: "Series", buf: Optional[IO[str]] = None, - length: bool = True, + length: Union[bool, str] = True, header: bool = True, index: bool = True, na_rep: str = "NaN", @@ -450,7 +450,7 @@ def _get_adjustment() -> TextAdjustment: class TableFormatter: - show_dimensions: bool + show_dimensions: Union[bool, str] is_truncated: bool formatters: formatters_type columns: Index @@ -554,7 +554,7 @@ def __init__( max_rows: Optional[int] = None, min_rows: Optional[int] = None, max_cols: Optional[int] = None, - show_dimensions: bool = False, + show_dimensions: Union[bool, str] = False, decimal: str = ".", table_id: Optional[str] = None, render_links: bool = False, @@ -1276,7 +1276,7 @@ class FloatArrayFormatter(GenericArrayFormatter): """ def __init__(self, *args, **kwargs): - GenericArrayFormatter.__init__(self, *args, **kwargs) + super().__init__(*args, **kwargs) # float_format is expected to be a string # formatter should be used to pass a function diff --git a/setup.cfg b/setup.cfg index 96af78c77feb8..700c9fdea12b2 100644 --- a/setup.cfg +++ b/setup.cfg @@ -123,6 +123,7 @@ skip = pandas/__init__.py,pandas/core/api.py ignore_missing_imports=True no_implicit_optional=True check_untyped_defs=True +strict_equality=True [mypy-pandas.tests.*] check_untyped_defs=False From 264256e1d61ddd9fc9309388b821a60450af2b5e Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Thu, 2 Jan 2020 16:11:19 +0000 Subject: [PATCH 2/2] black pandas --- pandas/core/arrays/boolean.py | 1 + pandas/core/arrays/string_.py | 1 + 2 files changed, 2 insertions(+) diff --git a/pandas/core/arrays/boolean.py b/pandas/core/arrays/boolean.py index 3c3033fd8efb6..63a2298ee02d5 100644 --- a/pandas/core/arrays/boolean.py +++ b/pandas/core/arrays/boolean.py @@ -59,6 +59,7 @@ class BooleanDtype(ExtensionDtype): >>> pd.BooleanDtype() BooleanDtype """ + name = "boolean" @property diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index dc57b28c167ac..0da877fb1ad45 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -46,6 +46,7 @@ class StringDtype(ExtensionDtype): >>> pd.StringDtype() StringDtype """ + name = "string" #: StringDtype.na_value uses pandas.NA