123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- from collections.abc import MutableSequence
- from functools import total_ordering
- from .helpers import NO_EXTENSIONS
- @total_ordering
- class FrozenList(MutableSequence):
- __slots__ = ("_frozen", "_items")
- def __init__(self, items=None):
- self._frozen = False
- if items is not None:
- items = list(items)
- else:
- items = []
- self._items = items
- @property
- def frozen(self):
- return self._frozen
- def freeze(self):
- self._frozen = True
- def __getitem__(self, index):
- return self._items[index]
- def __setitem__(self, index, value):
- if self._frozen:
- raise RuntimeError("Cannot modify frozen list.")
- self._items[index] = value
- def __delitem__(self, index):
- if self._frozen:
- raise RuntimeError("Cannot modify frozen list.")
- del self._items[index]
- def __len__(self):
- return self._items.__len__()
- def __iter__(self):
- return self._items.__iter__()
- def __reversed__(self):
- return self._items.__reversed__()
- def __eq__(self, other):
- return list(self) == other
- def __le__(self, other):
- return list(self) <= other
- def insert(self, pos, item):
- if self._frozen:
- raise RuntimeError("Cannot modify frozen list.")
- self._items.insert(pos, item)
- def __repr__(self):
- return f"<FrozenList(frozen={self._frozen}, {self._items!r})>"
- PyFrozenList = FrozenList
- try:
- from aiohttp._frozenlist import FrozenList as CFrozenList # type: ignore
- if not NO_EXTENSIONS:
- FrozenList = CFrozenList # type: ignore
- except ImportError: # pragma: no cover
- pass
|