|
77 | 77 |
|
78 | 78 | class BaseMaskedDtype(ExtensionDtype):
|
79 | 79 | """
|
80 |
| - Base class for dtypes for BasedMaskedArray subclasses. |
| 80 | + Base class for dtypes for BaseMaskedArray subclasses. |
81 | 81 | """
|
82 | 82 |
|
83 | 83 | name: str
|
@@ -208,19 +208,23 @@ def fillna(
|
208 | 208 | def _coerce_to_array(self, values) -> tuple[np.ndarray, np.ndarray]:
|
209 | 209 | raise AbstractMethodError(self)
|
210 | 210 |
|
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] |
| 211 | + def _validate_setitem_value(self, value) -> bool: |
| 212 | + raise AbstractMethodError(self) |
220 | 213 |
|
| 214 | + def __setitem__(self, key, value) -> None: |
221 | 215 | key = check_array_indexer(self, key)
|
222 |
| - self._data[key] = value |
223 |
| - self._mask[key] = mask |
| 216 | + if is_scalar(value): |
| 217 | + if self._validate_setitem_value(value): |
| 218 | + self._data[key] = value |
| 219 | + self._mask[key] = False |
| 220 | + elif value is libmissing.NA: |
| 221 | + self._mask[key] = True |
| 222 | + else: |
| 223 | + raise TypeError(f"Invalid value '{value}'") |
| 224 | + else: |
| 225 | + value, mask = self._coerce_to_array(value) |
| 226 | + self._data[key] = value |
| 227 | + self._mask[key] = mask |
224 | 228 |
|
225 | 229 | def __iter__(self):
|
226 | 230 | if self.ndim == 1:
|
|
0 commit comments