|
47 | 47 | )
|
48 | 48 | from pandas.core.dtypes.inference import is_array_like
|
49 | 49 | from pandas.core.dtypes.missing import (
|
| 50 | + is_valid_na_for_dtype, |
50 | 51 | isna,
|
51 | 52 | notna,
|
52 | 53 | )
|
|
77 | 78 |
|
78 | 79 | class BaseMaskedDtype(ExtensionDtype):
|
79 | 80 | """
|
80 |
| - Base class for dtypes for BasedMaskedArray subclasses. |
| 81 | + Base class for dtypes for BaseMaskedArray subclasses. |
81 | 82 | """
|
82 | 83 |
|
83 | 84 | name: str
|
@@ -208,19 +209,23 @@ def fillna(
|
208 | 209 | def _coerce_to_array(self, values) -> tuple[np.ndarray, np.ndarray]:
|
209 | 210 | raise AbstractMethodError(self)
|
210 | 211 |
|
211 |
| - def __setitem__(self, key, value) -> None: |
212 |
| - _is_scalar = is_scalar(value) |
213 |
| - if _is_scalar: |
214 |
| - value = [value] |
215 |
| - value, mask = self._coerce_to_array(value) |
216 |
| - |
217 |
| - if _is_scalar: |
218 |
| - value = value[0] |
219 |
| - mask = mask[0] |
| 212 | + def _validate_setitem_value(self, value) -> bool: |
| 213 | + raise AbstractMethodError(self) |
220 | 214 |
|
| 215 | + def __setitem__(self, key, value) -> None: |
221 | 216 | key = check_array_indexer(self, key)
|
222 |
| - self._data[key] = value |
223 |
| - self._mask[key] = mask |
| 217 | + if is_scalar(value): |
| 218 | + if self._validate_setitem_value(value): |
| 219 | + self._data[key] = value |
| 220 | + self._mask[key] = False |
| 221 | + elif isna(value) and is_valid_na_for_dtype(value): |
| 222 | + self._mask[key] = True |
| 223 | + else: |
| 224 | + raise TypeError(f"Invalid value '{value}' for dtype {self.dtype}") |
| 225 | + else: |
| 226 | + value, mask = self._coerce_to_array(value) |
| 227 | + self._data[key] = value |
| 228 | + self._mask[key] = mask |
224 | 229 |
|
225 | 230 | def __iter__(self):
|
226 | 231 | if self.ndim == 1:
|
|
0 commit comments