1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
from typing import Any, Iterator, List, Mapping, Tuple
class MappingView:
def __init__(self, mapping: Mapping[str, Any], *args: str):
self._mapping = mapping
self._args = args
def _keys(self) -> List[str]:
if len(self._args) == 0:
return list(self._mapping.keys())
else:
return [arg for arg in self._args if arg in self._mapping]
def __len__(self) -> int:
return len(self._keys())
def __repr__(self) -> str:
mapping = {key: self._mapping[key] for key in self._keys()}
return f'{self.__class__.__name__}({mapping})'
__class_getitem__ = classmethod(type([])) # type: ignore
class KeysView(MappingView):
def __iter__(self) -> Iterator[str]:
yield from self._keys()
class ValuesView(MappingView):
def __iter__(self) -> Iterator[Any]:
for key in self._keys():
yield self._mapping[key]
class ItemsView(MappingView):
def __iter__(self) -> Iterator[Tuple[str, Any]]:
for key in self._keys():
yield (key, self._mapping[key])
|