]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Added util.defaultdict for ticket #582
authorJason Kirtland <jek@discorporate.us>
Thu, 31 May 2007 19:13:23 +0000 (19:13 +0000)
committerJason Kirtland <jek@discorporate.us>
Thu, 31 May 2007 19:13:23 +0000 (19:13 +0000)
lib/sqlalchemy/util.py

index cb32c07ac20f9a267b9c45a9189d936b6fb79b1c..a5a051ddbdd01b8f4f3224a576372ff6c531198a 100644 (file)
@@ -30,6 +30,44 @@ except:
             i -= 1
         raise StopIteration()
 
+try:
+    from collections import defaultdict
+except:
+    class defaultdict(dict):
+        def __init__(self, default_factory=None, *a, **kw):
+            if (default_factory is not None and
+                not hasattr(default_factory, '__call__')):
+                raise TypeError('first argument must be callable')
+            dict.__init__(self, *a, **kw)
+            self.default_factory = default_factory
+        def __getitem__(self, key):
+            try:
+                return dict.__getitem__(self, key)
+            except KeyError:
+                value = self[key] = self.__missing__(key)
+                return value
+        def __missing__(self, key):
+            if self.default_factory is None:
+                raise KeyError(key)
+            return self.default_factory()
+        def __reduce__(self):
+            if self.default_factory is None:
+                args = tuple()
+            else:
+                args = self.default_factory,
+            return type(self), args, None, None, iter(self)
+        def copy(self):
+            return self.__copy__()
+        def __copy__(self):
+            return type(self)(self.default_factory, self)
+        def __deepcopy__(self, memo):
+            import copy
+            return type(self)(self.default_factory,
+                              copy.deepcopy(self.items()))
+        def __repr__(self):
+            return 'defaultdict(%s, %s)' % (self.default_factory,
+                                            dict.__repr__(self))
+
 def to_list(x):
     if x is None:
         return None