From 902a7dd6d567a7c184fb8f3fc3b1907e18037356 Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 14 Sep 2020 11:19:31 -0700 Subject: [PATCH] REF: share code for __setitem__ --- pandas/core/arrays/_mixins.py | 12 ++++++++++++ pandas/core/arrays/categorical.py | 14 -------------- pandas/core/arrays/datetimelike.py | 4 +--- pandas/core/arrays/numpy_.py | 8 -------- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index e9d8671b69c78..284dd31ffcb59 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -9,6 +9,7 @@ from pandas.core.algorithms import take, unique from pandas.core.array_algos.transforms import shift from pandas.core.arrays.base import ExtensionArray +from pandas.core.indexers import check_array_indexer _T = TypeVar("_T", bound="NDArrayBackedExtensionArray") @@ -156,3 +157,14 @@ def _validate_shift_value(self, fill_value): # TODO: after deprecation in datetimelikearraymixin is enforced, # we can remove this and ust validate_fill_value directly return self._validate_fill_value(fill_value) + + def __setitem__(self, key, value): + key = self._validate_setitem_key(key) + value = self._validate_setitem_value(value) + self._ndarray[key] = value + + def _validate_setitem_key(self, key): + return check_array_indexer(self, key) + + def _validate_setitem_value(self, value): + return value diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 45623f182144b..0d73f45f1a395 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -1884,20 +1884,6 @@ def __getitem__(self, key): return result return self._from_backing_data(result) - def __setitem__(self, key, value): - """ - Item assignment. - - Raises - ------ - ValueError - If (one or more) Value is not in categories or if a assigned - `Categorical` does not have the same categories - """ - key = self._validate_setitem_key(key) - value = self._validate_setitem_value(value) - self._ndarray[key] = value - def _validate_setitem_value(self, value): value = extract_array(value, extract_numpy=True) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 377996344dbbc..5c3ef2957073a 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -609,9 +609,7 @@ def __setitem__( if no_op: return - value = self._validate_setitem_value(value) - key = check_array_indexer(self, key) - self._ndarray[key] = value + super().__setitem__(key, value) self._maybe_clear_freq() def _maybe_clear_freq(self): diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index d3fa87d5ea7ff..61ffa28d31ba0 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -259,11 +259,6 @@ def __getitem__(self, item): result = type(self)(result) return result - def __setitem__(self, key, value) -> None: - key = self._validate_setitem_key(key) - value = self._validate_setitem_value(value) - self._ndarray[key] = value - def _validate_setitem_value(self, value): value = extract_array(value, extract_numpy=True) @@ -271,9 +266,6 @@ def _validate_setitem_value(self, value): value = np.asarray(value, dtype=self._ndarray.dtype) return value - def _validate_setitem_key(self, key): - return check_array_indexer(self, key) - def isna(self) -> np.ndarray: return isna(self._ndarray)