|
50 | 50 | from pandas.core.dtypes.inference import is_array_like
|
51 | 51 | from pandas.core.dtypes.missing import (
|
52 | 52 | array_equivalent,
|
| 53 | + is_valid_na_for_dtype, |
53 | 54 | isna,
|
54 | 55 | notna,
|
55 | 56 | )
|
|
82 | 83 |
|
83 | 84 | class BaseMaskedDtype(ExtensionDtype):
|
84 | 85 | """
|
85 |
| - Base class for dtypes for BasedMaskedArray subclasses. |
| 86 | + Base class for dtypes for BaseMaskedArray subclasses. |
86 | 87 | """
|
87 | 88 |
|
88 | 89 | name: str
|
@@ -213,19 +214,23 @@ def fillna(
|
213 | 214 | def _coerce_to_array(self, values) -> tuple[np.ndarray, np.ndarray]:
|
214 | 215 | raise AbstractMethodError(self)
|
215 | 216 |
|
216 |
| - def __setitem__(self, key, value) -> None: |
217 |
| - _is_scalar = is_scalar(value) |
218 |
| - if _is_scalar: |
219 |
| - value = [value] |
220 |
| - value, mask = self._coerce_to_array(value) |
221 |
| - |
222 |
| - if _is_scalar: |
223 |
| - value = value[0] |
224 |
| - mask = mask[0] |
| 217 | + def _validate_setitem_value(self, value) -> bool: |
| 218 | + raise AbstractMethodError(self) |
225 | 219 |
|
| 220 | + def __setitem__(self, key, value) -> None: |
226 | 221 | key = check_array_indexer(self, key)
|
227 |
| - self._data[key] = value |
228 |
| - self._mask[key] = mask |
| 222 | + if is_scalar(value): |
| 223 | + if self._validate_setitem_value(value): |
| 224 | + self._data[key] = value |
| 225 | + self._mask[key] = False |
| 226 | + elif isna(value) and is_valid_na_for_dtype(value): |
| 227 | + self._mask[key] = True |
| 228 | + else: |
| 229 | + raise TypeError(f"Invalid value '{value}' for dtype {self.dtype}") |
| 230 | + else: |
| 231 | + value, mask = self._coerce_to_array(value) |
| 232 | + self._data[key] = value |
| 233 | + self._mask[key] = mask |
229 | 234 |
|
230 | 235 | def __iter__(self):
|
231 | 236 | if self.ndim == 1:
|
|
0 commit comments