From: Jason Kirtland Date: Thu, 31 May 2007 19:13:23 +0000 (+0000) Subject: Added util.defaultdict for ticket #582 X-Git-Tag: rel_0_4_6~230 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b19ca985e36b5c8c6f7c1ac9dd64f57752b68d36;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Added util.defaultdict for ticket #582 --- diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index cb32c07ac2..a5a051ddbd 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -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