[Python-Dev] Add a frozendict builtin type
Jim J. Jewett
jimjjewett at gmail.com
Mon Feb 27 23:50:35 CET 2012
In http://mail.python.org/pipermail/python-dev/2012-February/116955.html
Victor Stinner proposed:
> The blacklist implementation has a major issue: it is still possible
> to call write methods of the dict class (e.g. dict.set(my_frozendict,
> key, value)).
It is also possible to use ctypes and violate even more invariants.
For most purposes, this falls under "consenting adults".
> The whitelist implementation has an issue: frozendict and dict are not
> "compatible", dict is not a subclass of frozendict (and frozendict is
> not a subclass of dict).
And because of Liskov substitutability, they shouldn't be; they should
be sibling children of a basedict that doesn't have the the mutating
methods, but also doesn't *promise* not to mutate.
> * frozendict values must be immutable, as dict keys
Why? That may be useful, but an immutable dict whose values
might mutate is also useful; by forcing that choice, it starts
to feel too specialized for a builtin.
> * Add an hash field to the PyDictObject structure
That is another indication that it should really be a sibling class;
most of the uses I have had for immutable dicts still didn't need
hashing. It might be a worth adding anyhow, but only to immutable
dicts -- not to every instance dict or keywords parameter.
> * frozendict.__hash__ computes hash(frozenset(self.items())) and
> caches the result is its private hash attribute
Why? hash(frozenset(selk.keys())) would still meet the hash contract,
but it would be approximately twice as fast, and I can think of only
one case where it wouldn't work just as well. (That case is wanting
to store a dict of alternative configuration dicts (with no defaulting
of values), but ALSO wanting to use the configurations themselves
(as opposed to their names) as the dict keys.)
-jJ
--
If there are still threading problems with my replies, please
email me with details, so that I can try to resolve them. -jJ
More information about the Python-Dev
mailing list