Skip to content

TYP: pandas/core/dtypes/base.py #31352

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Feb 12, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions pandas/core/dtypes/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@
Extend pandas with custom array types.
"""

from typing import Any, List, Optional, Tuple, Type
from typing import TYPE_CHECKING, Any, List, Optional, Tuple, Type

import numpy as np

from pandas.errors import AbstractMethodError

from pandas.core.dtypes.generic import ABCDataFrame, ABCIndexClass, ABCSeries

if TYPE_CHECKING:
from pandas.core.arrays import ExtensionArray # noqa: F401


class ExtensionDtype:
"""
Expand All @@ -29,7 +32,6 @@ class ExtensionDtype:

* type
* name
* construct_from_string

The following attributes influence the behavior of the dtype in
pandas operations
Expand Down Expand Up @@ -74,7 +76,7 @@ class property**.
class ExtensionDtype:

def __from_arrow__(
self, array: pyarrow.Array/ChunkedArray
self, array: Union[pyarrow.Array, pyarrow.ChunkedArray]
) -> ExtensionArray:
...

Expand Down Expand Up @@ -122,11 +124,11 @@ def __eq__(self, other: Any) -> bool:
def __hash__(self) -> int:
return hash(tuple(getattr(self, attr) for attr in self._metadata))

def __ne__(self, other) -> bool:
def __ne__(self, other: Any) -> bool:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did we ever decide on consistent use of Any vs object here? Thought we were using object but maybe missed that

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in this class we already have def __eq__(self, other: Any) -> bool: and in #29947, Any was applied throughout.

I think it should be object in order to check the body of the __eq__/__ne__ methods, but since we want consistency these will need to be changed as well...

__eq__

pandas/core/arrays/interval.py:    def __eq__(self, other):
pandas/core/arrays/sparse/dtype.py:    def __eq__(self, other: Any) -> bool:
pandas/core/arrays/_arrow_utils.py:        def __eq__(self, other):
pandas/core/arrays/_arrow_utils.py:        def __eq__(self, other):
pandas/core/dtypes/base.py:    def __eq__(self, other: Any) -> bool:
pandas/core/dtypes/dtypes.py:    def __eq__(self, other: Any) -> bool:
pandas/core/dtypes/dtypes.py:    def __eq__(self, other: Any) -> bool:
pandas/core/dtypes/dtypes.py:    def __eq__(self, other: Any) -> bool:
pandas/core/dtypes/dtypes.py:    def __eq__(self, other: Any) -> bool:
pandas/core/indexes/frozen.py:    def __eq__(self, other: Any) -> bool:
pandas/io/pytables.py:    def __eq__(self, other: Any) -> bool:
pandas/io/pytables.py:    def __eq__(self, other: Any) -> bool:
pandas/io/stata.py:    def __eq__(self, other: Any) -> bool:
pandas/tests/groupby/test_function.py:        def __eq__(self, other):
pandas/tests/indexing/test_indexing.py:            def __eq__(self, other) -> bool:
pandas/tests/scalar/timedelta/test_timedelta.py:            def __eq__(self, other):
pandas/tests/scalar/timestamp/test_comparisons.py:        def __eq__(self, other) -> bool:
pandas/tests/series/test_ufunc.py:        def __eq__(self, other) -> bool:
pandas/tests/test_algos.py:            def __eq__(self, other) -> bool:
pandas/tseries/offsets.py:    def __eq__(self, other: Any) -> bool:
pandas/_libs/tslibs/offsets.pyx:    def __eq__(self, other: Any) -> bool:

__ne__

pandas/core/arrays/interval.py:    def __ne__(self, other):
pandas/io/pytables.py:    def __ne__(self, other) -> bool:
pandas/tests/series/test_duplicates.py:        def __ne__(self, other):
pandas/tseries/offsets.py:    def __ne__(self, other):
pandas/_libs/tslibs/offsets.pyx:    def __ne__(self, other):

However, doing this raises issues with Extension Array equalities, see #31646. So should be done in a separate PR, I think though that this does affirm the need to use object instead of Any for more thorough checking.

return not self.__eq__(other)

@property
def na_value(self):
def na_value(self) -> object:
"""
Default NA value to use for this type.

Expand Down Expand Up @@ -184,7 +186,7 @@ def names(self) -> Optional[List[str]]:
return None

@classmethod
def construct_array_type(cls):
def construct_array_type(cls) -> Type["ExtensionArray"]:
"""
Return the array type associated with this dtype.

Expand Down Expand Up @@ -250,7 +252,7 @@ def construct_from_string(cls, string: str):
return cls()

@classmethod
def is_dtype(cls, dtype) -> bool:
def is_dtype(cls, dtype: object) -> bool:
"""
Check if we match 'dtype'.

Expand All @@ -261,7 +263,7 @@ def is_dtype(cls, dtype) -> bool:

Returns
-------
is_dtype : bool
bool

Notes
-----
Expand Down