[Python-checkins] peps: Add the PEP 416: Add a frozendict builtin type

victor.stinner python-checkins at python.org
Wed Feb 29 18:58:51 CET 2012


http://hg.python.org/peps/rev/369cd3f69cd2
changeset:   4100:369cd3f69cd2
user:        Victor Stinner <vstinner at wyplay.com>
date:        Wed Feb 29 18:58:50 2012 +0100
summary:
  Add the PEP 416: Add a frozendict builtin type

files:
  pep-0400.txt |    2 +-
  pep-0410.txt |    2 +-
  pep-0416.txt |  112 +++++++++++++++++++++++++++++++++++++++
  3 files changed, 114 insertions(+), 2 deletions(-)


diff --git a/pep-0400.txt b/pep-0400.txt
--- a/pep-0400.txt
+++ b/pep-0400.txt
@@ -2,7 +2,7 @@
 Title: Deprecate codecs.StreamReader and codecs.StreamWriter
 Version: $Revision$
 Last-Modified: $Date$
-Author: Victor Stinner <victor.stinner at haypocalc.com>
+Author: Victor Stinner <victor.stinner at gmail.com>
 Status: Draft
 Type: Standards Track
 Content-Type: text/x-rst
diff --git a/pep-0410.txt b/pep-0410.txt
--- a/pep-0410.txt
+++ b/pep-0410.txt
@@ -2,7 +2,7 @@
 Title: Use decimal.Decimal type for timestamps
 Version: $Revision$
 Last-Modified: $Date$
-Author: Victor Stinner <victor.stinner at haypocalc.com>
+Author: Victor Stinner <victor.stinner at gmail.com>
 Status: Rejected
 Type: Standards Track
 Content-Type: text/x-rst
diff --git a/pep-0416.txt b/pep-0416.txt
new file mode 100644
--- /dev/null
+++ b/pep-0416.txt
@@ -0,0 +1,112 @@
+PEP: 416
+Title: Add a frozendict builtin type
+Version: $Revision$
+Last-Modified: $Date$
+Author: Victor Stinner <victor.stinner at gmail.com>
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 29-February-2012
+Python-Version: 3.3
+
+
+Abstract
+========
+
+Add a new frozendict builtin type.
+
+
+Rationale
+=========
+
+A frozendict mapping cannot be changed, but its values can be mutable (not
+hashable). A frozendict is hashable and so immutable if all values are hashable
+(immutable).
+
+Use cases of frozendict:
+
+ * hashable frozendict can be used as a key of a mapping or as a member of set
+ * frozendict helps optimization because the mapping is constant
+ * frozendict avoids the need of a lock when the frozendict is shared
+   by multiple threads or processes, especially hashable frozendict
+
+
+Constraints
+===========
+
+ * frozendict has to implement the Mapping abstract base class
+ * frozendict keys and values can be unorderable
+ * a frozendict is hashable if all keys and values are hashable
+ * frozendict hash does not depend on the items creation order
+
+
+Implementation
+==============
+
+ * Add a PyFrozenDictObject structure based on PyDictObject with an extra
+   "Py_hash_t hash;" field
+ * frozendict.__hash__() is implemented using hash(frozenset(self.items())) and
+   caches the result in its private hash attribute
+ * Register frozendict has a collections.abc.Mapping
+ * frozendict can be used with PyDict_GetItem(), but PyDict_SetItem() and
+   PyDict_DelItem() raise a TypeError
+
+
+Recipe: immutable dict
+======================
+
+An immutable mapping can be implemented using frozendict::
+
+    import itertools
+
+    class immutabledict(frozendict):
+        def __new__(cls, *args, **kw):
+            # ensure that all values are immutable
+            for key, value in itertools.chain(args, kw.items()):
+                if not isinstance(value, (int, float, complex, str, bytes)):
+                    hash(value)
+            # frozendict ensures that all keys are immutable
+            return frozendict.__new__(cls, *args, **kw)
+
+        def __repr__(self):
+            return 'immutabledict' + frozendict.__repr__(self)[10:]
+
+
+Objections
+==========
+
+*namedtuple may fit the requiements of a frozendict.*
+
+A namedtuple is not a mapping, it does not implement the Mapping abstract base
+class.
+
+*frozendict can be implemented in Python using descriptors" and "frozendict
+just need to be practically constant.*
+
+If frozendict is used to harden Python (security purpose), it must be
+implemented in C. A type implemented in C is also faster.
+
+*The PEP 351 was rejected.*
+
+The PEP 351 tries to freeze an object and so may convert a mutable object to an
+immutable object (using a different type). frozendict doesn't convert anything:
+hash(frozendict) raises a TypeError if a value is not hashable. Freezing an
+object is not the purpose of this PEP.
+
+
+Links
+=====
+
+ * PEP 412: Key-Sharing Dictionary
+   (`issue #13903 <http://bugs.python.org/issue13903>`_)
+ * PEP 351: The freeze protocol
+ * `The case for immutable dictionaries; and the central misunderstanding of PEP 351 <http://www.cs.toronto.edu/~tijmen/programming/immutableDictionaries.html>`_
+ * `Frozen dictionaries (Python recipe 414283) <http://code.activestate.com/recipes/414283-frozen-dictionaries/>`_
+   by Oren Tirosh
+
+
+Copyright
+=========
+
+This document has been placed in the public domain.
+

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list