From 4604bee1ce82ff3b205e29db76b10d0ecc7bd739 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Sun, 7 Sep 2025 11:37:06 +0200 Subject: [PATCH 1/3] TYP: update EA.view() type annotation to indicate it returns an EA without dtype parameter --- pandas/core/arrays/_mixins.py | 6 ++++++ pandas/core/arrays/base.py | 6 ++++++ pandas/core/arrays/string_.py | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index 5fb5874371120..0c2ef797ff044 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -113,6 +113,12 @@ def _validate_scalar(self, value): # ------------------------------------------------------------------------ + @overload + def view(self) -> Self: ... + + @overload + def view(self, dtype: Dtype | None = ...) -> ArrayLike: ... + def view(self, dtype: Dtype | None = None) -> ArrayLike: # We handle datetime64, datetime64tz, timedelta64, and period # dtypes here. Everything else we pass through to the underlying diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index 1cd10a9eef9d1..a905e27b5f1ca 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -1804,6 +1804,12 @@ def copy(self) -> Self: """ raise AbstractMethodError(self) + @overload + def view(self) -> ExtensionArray: ... + + @overload + def view(self, dtype: Dtype | None = ...) -> ArrayLike: ... + def view(self, dtype: Dtype | None = None) -> ArrayLike: """ Return a view on the array. diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index f58d0b1c0b948..14fcd4eb79a31 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -546,10 +546,10 @@ def _str_map_nan_semantics( else: return self._str_map_str_or_object(dtype, na_value, arr, f, mask) - def view(self, dtype: Dtype | None = None) -> ArrayLike: + def view(self, dtype: Dtype | None = None) -> Self: if dtype is not None: raise TypeError("Cannot change data-type for string array.") - return super().view(dtype=dtype) + return super().view() # error: Definition of "_concat_same_type" in base class "NDArrayBacked" is From 29ba5fee343b237c23a04578b378b7d58c01d970 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Mon, 8 Sep 2025 11:02:18 +0200 Subject: [PATCH 2/3] try use ExtensionArray instead of Self --- pandas/core/arrays/_mixins.py | 2 +- pandas/core/arrays/datetimelike.py | 2 +- pandas/core/arrays/string_.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index 0c2ef797ff044..485ade323ebf2 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -114,7 +114,7 @@ def _validate_scalar(self, value): # ------------------------------------------------------------------------ @overload - def view(self) -> Self: ... + def view(self) -> ExtensionArray: ... @overload def view(self, dtype: Dtype | None = ...) -> ArrayLike: ... diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 3a2a6c1dde7c8..233aeb48b70cd 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -509,7 +509,7 @@ def astype(self, dtype, copy: bool = True): return np.asarray(self, dtype=dtype) @overload - def view(self) -> Self: ... + def view(self) -> ExtensionArray: ... @overload def view(self, dtype: Literal["M8[ns]"]) -> DatetimeArray: ... diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index 14fcd4eb79a31..91ab449e4a059 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -546,7 +546,7 @@ def _str_map_nan_semantics( else: return self._str_map_str_or_object(dtype, na_value, arr, f, mask) - def view(self, dtype: Dtype | None = None) -> Self: + def view(self, dtype: Dtype | None = None) -> ExtensionArray: if dtype is not None: raise TypeError("Cannot change data-type for string array.") return super().view() From a8644f9e7f059c3022b463734e363bf611baf394 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Mon, 8 Sep 2025 14:46:03 +0200 Subject: [PATCH 3/3] try with Self everywhere, ignore override in datetimelike --- pandas/core/arrays/_mixins.py | 2 +- pandas/core/arrays/base.py | 2 +- pandas/core/arrays/datetimelike.py | 4 ++-- pandas/core/arrays/string_.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index 485ade323ebf2..0c2ef797ff044 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -114,7 +114,7 @@ def _validate_scalar(self, value): # ------------------------------------------------------------------------ @overload - def view(self) -> ExtensionArray: ... + def view(self) -> Self: ... @overload def view(self, dtype: Dtype | None = ...) -> ArrayLike: ... diff --git a/pandas/core/arrays/base.py b/pandas/core/arrays/base.py index a905e27b5f1ca..07c297b2c15ff 100644 --- a/pandas/core/arrays/base.py +++ b/pandas/core/arrays/base.py @@ -1805,7 +1805,7 @@ def copy(self) -> Self: raise AbstractMethodError(self) @overload - def view(self) -> ExtensionArray: ... + def view(self) -> Self: ... @overload def view(self, dtype: Dtype | None = ...) -> ArrayLike: ... diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 233aeb48b70cd..561bf7d42d289 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -508,8 +508,8 @@ def astype(self, dtype, copy: bool = True): else: return np.asarray(self, dtype=dtype) - @overload - def view(self) -> ExtensionArray: ... + @overload # type: ignore[override] + def view(self) -> Self: ... @overload def view(self, dtype: Literal["M8[ns]"]) -> DatetimeArray: ... diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index 91ab449e4a059..14fcd4eb79a31 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -546,7 +546,7 @@ def _str_map_nan_semantics( else: return self._str_map_str_or_object(dtype, na_value, arr, f, mask) - def view(self, dtype: Dtype | None = None) -> ExtensionArray: + def view(self, dtype: Dtype | None = None) -> Self: if dtype is not None: raise TypeError("Cannot change data-type for string array.") return super().view()