
On Thu, Oct 11, 2018 at 1:02 PM Cameron Simpson <cs@cskk.id.au> wrote:
On 10Oct2018 20:25, Philip Martin <philip.martin2007@gmail.com> wrote:
Steven, that's a great idea, and I would be 100% up for your suggestion to have types.MappingProxyType renamed to frozendict.
I'm not for the rename, myself. Though I'd not be against a frozendict factory in builtins, a tiny shim for MappingProxyType.
However, the differences in the behavior of MappingProxyType's constructor versus dict's would make the API's behavior confusing IMO. For example, MappingProxyType(x=5, y=10) throws a TypeError. I don't think most people would expect this.
Well, if it were called frozendict, indeed not. It should act like dict.
So:
def frozendict(**kw): return MappingProxyType(kw)
You could make an argument for that (or a slightly heftier version accepting the various things dict accepts). Or... you could just keep such a thing in your personal kit as a trivial way to spell "frozendict". One could argue for the above as a nice example to live in the docs perhaps.
But not everything needs a special name.
Point of note: A mapping proxy is NOT immutable; it is merely read-only.
from types import MappingProxyType d = {'a':1, 'b':2} p = MappingProxyType(d) p mappingproxy({'a': 1, 'b': 2}) d['a'] = 3 p mappingproxy({'a': 3, 'b': 2})
A frozendict type, if it's meant to parallel frozenset, ought to be hashable (subject to the hashability of its members, of course), but you can't just take MPT and toss in a __hash__ method. No idea how important that use-case is, but Michael Selik mentioned "want[ing] to use a dict as a dict key about once or twice a year", which MPT is not able to do. Interestingly, frozenset isn't a subclass of set. I was going to say that a frozendict ought to be a dict, but maybe that isn't so important. Which might make a simple pure-Python frozendict actually pretty easy. ChrisA