Generic, converting, list-to-list proxy.
| 1467 | |
| 1468 | |
| 1469 | class _AssociationList(_AssociationSingleItem[_T], MutableSequence[_T]): |
| 1470 | """Generic, converting, list-to-list proxy.""" |
| 1471 | |
| 1472 | col: MutableSequence[_T] |
| 1473 | |
| 1474 | def _set(self, object_: Any, value: _T) -> None: |
| 1475 | self.setter(object_, value) |
| 1476 | |
| 1477 | @overload |
| 1478 | def __getitem__(self, index: int) -> _T: ... |
| 1479 | |
| 1480 | @overload |
| 1481 | def __getitem__(self, index: slice) -> MutableSequence[_T]: ... |
| 1482 | |
| 1483 | def __getitem__( |
| 1484 | self, index: Union[int, slice] |
| 1485 | ) -> Union[_T, MutableSequence[_T]]: |
| 1486 | if not isinstance(index, slice): |
| 1487 | return self._get(self.col[index]) |
| 1488 | else: |
| 1489 | return [self._get(member) for member in self.col[index]] |
| 1490 | |
| 1491 | @overload |
| 1492 | def __setitem__(self, index: int, value: _T) -> None: ... |
| 1493 | |
| 1494 | @overload |
| 1495 | def __setitem__(self, index: slice, value: Iterable[_T]) -> None: ... |
| 1496 | |
| 1497 | def __setitem__( |
| 1498 | self, index: Union[int, slice], value: Union[_T, Iterable[_T]] |
| 1499 | ) -> None: |
| 1500 | if not isinstance(index, slice): |
| 1501 | self._set(self.col[index], cast("_T", value)) |
| 1502 | else: |
| 1503 | if index.stop is None: |
| 1504 | stop = len(self) |
| 1505 | elif index.stop < 0: |
| 1506 | stop = len(self) + index.stop |
| 1507 | else: |
| 1508 | stop = index.stop |
| 1509 | step = index.step or 1 |
| 1510 | |
| 1511 | start = index.start or 0 |
| 1512 | rng = list(range(index.start or 0, stop, step)) |
| 1513 | |
| 1514 | sized_value = list(value) |
| 1515 | |
| 1516 | if step == 1: |
| 1517 | for i in rng: |
| 1518 | del self[start] |
| 1519 | i = start |
| 1520 | for item in sized_value: |
| 1521 | self.insert(i, item) |
| 1522 | i += 1 |
| 1523 | else: |
| 1524 | if len(sized_value) != len(rng): |
| 1525 | raise ValueError( |
| 1526 | "attempt to assign sequence of size %s to " |