From: Christian Heller Date: Wed, 19 Nov 2025 21:19:23 +0000 (+0100) Subject: Un-smarten Dict. X-Git-Url: https://plomlompom.com/repos/%7B%7Bprefix%7D%7D/%7B%7Bdb.prefix%7D%7D/todo?a=commitdiff_plain;h=86df1674dc369e824762060a89defc0101ade00a;p=ircplom Un-smarten Dict. --- diff --git a/src/ircplom/db_primitives.py b/src/ircplom/db_primitives.py index 87cc428..f2bf8ee 100644 --- a/src/ircplom/db_primitives.py +++ b/src/ircplom/db_primitives.py @@ -36,36 +36,50 @@ DictItem = TypeVar('DictItem') class Dict(Clearable, Generic[DictItem]): - 'Customized dict replacement.' + 'Reduced dict only allowing one item type, communicated in ._item_cls.' def __init__(self, **kwargs) -> None: self._dict: dict[str, DictItem] = {} super().__init__(**kwargs) - def __getattribute__(self, key: str): - if key in {'items', 'keys', 'values'}: - return getattr(self._dict, key) - return super().__getattribute__(key) - - def __getitem__(self, key: str) -> DictItem: - return self._dict[key] - - def clear(self) -> None: - self._dict.clear() - @property def _item_cls(self): orig_cls = (self.__orig_class__ if hasattr(self, '__orig_class__') else self.__orig_bases__[0]) return orig_cls.__args__[0] + # NB: Some of below wrappers around ._dict method calls were previously + # replaced by .__getattribute__ simply returning getattr(self._dict, key). + # This however confused subclasses super() (which doesn't check instance's + # .__getattribute__ but looks at class method definitions), and wouldn't + # satisfy abstractmethod slots such as for Clearable.clear. + def __setitem__(self, key: str, val: DictItem) -> None: assert isinstance(val, self._item_cls), (type(val), self._item_cls) self._dict[key] = val + def __getitem__(self, key: str) -> DictItem: + return self._dict[key] + def __delitem__(self, key: str) -> None: del self._dict[key] + def clear(self) -> None: + 'Wrapper around dict.clear().' + self._dict.clear() + + def items(self) -> tuple[tuple[str, DictItem], ...]: + 'Wrapper around dict.values().' + return tuple(((key, val) for key, val in self._dict.items())) + + def keys(self) -> tuple[str, ...]: + 'Wrapper around dict.keys().' + return tuple((key for key in self._dict)) + + def values(self) -> tuple[DictItem, ...]: + 'Wrapper around dict.values().' + return tuple((val for val in self._dict.values())) + class Completable(ABC): 'Data whose collection can be declared complete/incomplete.' diff --git a/src/tests/connect_disconnect_legalities.test b/src/tests/connect_disconnect_legalities.test index c001320..6da0223 100644 --- a/src/tests/connect_disconnect_legalities.test +++ b/src/tests/connect_disconnect_legalities.test @@ -1,5 +1,4 @@ insert ./lib/001-to-usermode -insert ./lib/already-disconnected insert ./lib/cmd-disconnect # for: cmd-disconnect insert ./lib/connect-to-connected