On Sat, Apr 02, 2022 at 09:28:55AM -0700, Christopher Barker wrote:

> Anyway, it would be nice for someone to take up the mantle of getting an
> immutable Mapping into the stdlib.

Here is a "FrozenMapping" class that could be added to collections. I 
have tested it ~~extensively~~ for nearly two minutes and haven't been 
able to break it, so it must be good *wink*


```
from collections.abc import Mapping
from types import MappingProxyType

class FrozenMapping(Mapping):
    __slots__ = ('_proxy', '_hash')

    def __new__(cls, *args, **kwargs):
        a = dict(*args, **kwargs)
        obj = super().__new__(cls)
        obj._proxy = MappingProxyType(a)
        obj._hash = None
        return obj

    def __getitem__(self, key):
        return self._proxy[key]

    def __iter__(self):
        yield from self._proxy

    def __len__(self):
        return len(self._proxy)

    def copy(self):
        return self  # We're immutable.

    def __reversed__(self):
        return reversed(self._proxy)

    def __or__(self, other):
        return type(self)(self._proxy | other)

    def __ror__(self, other):
        return type(self)(other | self._proxy)

    def __hash__(self):
        if self._hash is None:
            self._hash = hash(frozenset(self.items()))
        return self._hash

    def __repr__(self):
        items = ', '.join(['%r: %r' % t for t in self.items()])
        return '%s({%s})' % (type(self).__name__, items)

```

I haven't considered pickling, or deep-copying. I don't think there is 
any way to get access to the underlying dict and modify it, except 
perhaps via ctypes, so I think it is as immutable as it is possible to 
get from Python code. Feel free to take that as a challenge to break it.

Does anyone want to champion adding this to collections? I guess it will 
need at least a short PEP to justify that there are use-cases for frozen 
mappings.


-- 
Steve
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/VDMJVEFP7FK3M25ICJGWG7XJXPPUN6OQ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to