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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| from itertools import repeat
def is_immutable(self): raise TypeError(f"{type(self).__name__!r} objects are immutable")
class ImmutableDictMixin: """Makes a :class:`dict` immutable.
.. versionadded:: 0.5
:private: """
_hash_cache = None
@classmethod def fromkeys(cls, keys, value=None): instance = super().__new__(cls) instance.__init__(zip(keys, repeat(value))) return instance
def __reduce_ex__(self, protocol): return type(self), (dict(self),)
def _iter_hashitems(self): return self.items()
def __hash__(self): if self._hash_cache is not None: return self._hash_cache rv = self._hash_cache = hash(frozenset(self._iter_hashitems())) return rv
def setdefault(self, key, default=None): is_immutable(self)
def update(self, *args, **kwargs): is_immutable(self)
def pop(self, key, default=None): is_immutable(self)
def popitem(self): is_immutable(self)
def __setitem__(self, key, value): is_immutable(self)
def __delitem__(self, key): is_immutable(self)
def clear(self): is_immutable(self)
class ImmutableDict(ImmutableDictMixin, dict): """An immutable :class:`dict`.
.. versionadded:: 0.5 """
def __repr__(self): return f"{type(self).__name__}({dict.__repr__(self)})"
def copy(self): """Return a shallow mutable copy of this object. Keep in mind that the standard library's :func:`copy` function is a no-op for this class like for any other python immutable type (eg: :class:`tuple`). """ return dict(self)
def __copy__(self): return self
if __name__ == '__main__': default_config = ImmutableDict( { "DEBUG": None, "TESTING": False, "PROPAGATE_EXCEPTIONS": None, "SECRET_KEY": None, } )
default_config["DEBUG"] = True
$ Traceback (most recent call last): File "C:\test\main.py", line 88, in <module> default_config["DEBUG"] = True File "C:\test\main.py", line 49, in __setitem__ is_immutable(self) File "C:\test\main.py", line 5, in is_immutable raise TypeError(f"{type(self).__name__!r} objects are immutable") TypeError: 'ImmutableDict' objects are immutable
|