Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
79 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
from collections.abc import MutableMapping | ||
from typing import Any, Iterable | ||
|
||
from .sentinel import NOT_SET | ||
|
||
# * MultiDict | ||
# * Ordered / Indexed | ||
# * frozen | ||
# * bijection | ||
|
||
class DictExtended(MutableMapping): | ||
|
||
__slots__ = ('_data', ) | ||
|
||
def __init__(self, iterable: Iterable, default: Any = NOT_SET, **kwargs): | ||
self._data = {} | ||
self.default = default | ||
self.update(iterable, **kwargs) | ||
|
||
def _default_value(self): | ||
try: | ||
return self.default() | ||
except TypeError: | ||
# default is not Callable | ||
return self.default | ||
|
||
def __len__(self): | ||
return len(self._data) | ||
|
||
def __getitem__(self, key): | ||
try: | ||
return self._data[key] | ||
except KeyError: | ||
if self.default is NOT_SET: | ||
raise | ||
else: | ||
return elf._default_value() | ||
|
||
def __setitem__(self, key, value): | ||
self._data[key] = value | ||
|
||
def __delitem__(self, key): | ||
del self._data[key] | ||
|
||
def __contains__(self, key): | ||
return key in self._data | ||
|
||
def get(self, key, default=None): | ||
try: | ||
return self._data[key] | ||
except KeyError: | ||
return default | ||
|
||
def pop(self, key, default=NOT_SET): | ||
raise NotImplementedError | ||
|
||
def popitem(self): | ||
raise NotImplementedError | ||
|
||
def clear(self): | ||
self._data.clear() | ||
|
||
def update(self, other=None, /, **kwargs): | ||
raise NotImplementedError | ||
|
||
def setdefault(self, key, default=None): | ||
raise NotImplementedError | ||
|
||
def keys(self): | ||
return self._data.keys() | ||
|
||
def items(self): | ||
return self._data.items() | ||
|
||
def values(self): | ||
return self._data.values() | ||
|
||
def __eq__(self, other): | ||
raise NotImplementedError |