[Python-3000-checkins] r60586 - in python/branches/py3k: Lib/collections.py Misc/NEWS

raymond.hettinger python-3000-checkins at python.org
Tue Feb 5 02:53:00 CET 2008


Author: raymond.hettinger
Date: Tue Feb  5 02:53:00 2008
New Revision: 60586

Modified:
   python/branches/py3k/Lib/collections.py
   python/branches/py3k/Misc/NEWS
Log:
Put an updated UserDict class in the collections module and 
register it as a compliant Mutable Mapping.

Todo:  Convert the UserDict dependent tests to the new API
       and then remove the old UserDict module.  Move the
       UserDict docs to collections.rst.



Modified: python/branches/py3k/Lib/collections.py
==============================================================================
--- python/branches/py3k/Lib/collections.py	(original)
+++ python/branches/py3k/Lib/collections.py	Tue Feb  5 02:53:00 2008
@@ -1,4 +1,4 @@
-__all__ = ['deque', 'defaultdict', 'namedtuple']
+__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict']
 # For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
 # They should however be considered an integral part of collections.py.
 from _abcoll import *
@@ -10,6 +10,10 @@
 from keyword import iskeyword as _iskeyword
 import sys as _sys
 
+################################################################################
+### namedtuple
+################################################################################
+
 def namedtuple(typename, field_names, verbose=False):
     """Returns a new subclass of tuple with named fields.
 
@@ -106,7 +110,60 @@
 
 
 
+################################################################################
+### UserDict
+################################################################################
+
+class UserDict(MutableMapping):
+
+    # Start by filling-out the abstract methods
+    def __init__(self, dict=None, **kwargs):
+        self.data = {}
+        if dict is not None:
+            self.update(dict)
+        if len(kwargs):
+            self.update(kwargs)
+    def __len__(self): return len(self.data)
+    def __getitem__(self, key):
+        if key in self.data:
+            return self.data[key]
+        if hasattr(self.__class__, "__missing__"):
+            return self.__class__.__missing__(self, key)
+        raise KeyError(key)
+    def __setitem__(self, key, item): self.data[key] = item
+    def __delitem__(self, key): del self.data[key]
+    def __iter__(self):
+        return iter(self.data)
+
+
+    # Now, add the methods in dicts but not in MutableMapping
+    def __repr__(self): return repr(self.data)
+    def copy(self):
+        if self.__class__ is UserDict:
+            return UserDict(self.data.copy())
+        import copy
+        data = self.data
+        try:
+            self.data = {}
+            c = copy.copy(self)
+        finally:
+            self.data = data
+        c.update(self)
+        return c
+    @classmethod
+    def fromkeys(cls, iterable, value=None):
+        d = cls()
+        for key in iterable:
+            d[key] = value
+        return d
+
+MutableMapping.register(UserDict)
+
+
 
+################################################################################
+### Simple tests
+################################################################################
 
 if __name__ == '__main__':
     # verify that instances can be pickled

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Tue Feb  5 02:53:00 2008
@@ -70,6 +70,13 @@
 Library
 -------
 
+- Weakref dictionaries now inherit from MutableMapping.
+  XXX their API still needs to be modernized (i.e. eliminate the iter methods).
+
+- Created new UserDict class in collections module.  This one inherits from and
+  complies with the MutableMapping ABC.  
+  XXX still need to covert old UserDict based tests and eliminate the old UserDict module.
+
 - Removed UserDict.DictMixin.  Replaced all its uses with collections.MutableMapping.
 
 - Issue #1703: getpass() should flush after writing prompt.


More information about the Python-3000-checkins mailing list