Author: tmckay
Date: 2011-02-23 16:37:20 +0000 (Wed, 23 Feb 2011)
New Revision: 4554
Modified:
trunk/parsley/python/parsley/collectionsex.py
Log:
Replace implementation of defaultdict for Python 2.4
Modified: trunk/parsley/python/parsley/collectionsex.py
===================================================================
--- trunk/parsley/python/parsley/collectionsex.py 2011-02-22 20:28:38 UTC (rev 4553)
+++ trunk/parsley/python/parsley/collectionsex.py 2011-02-23 16:37:20 UTC (rev 4554)
@@ -1,19 +1,39 @@
try:
from collections import defaultdict
-except ImportError:
+except:
class defaultdict(dict):
- def __init__(self, default_factory=None):
- super(dict, self).__init__()
-
+ 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:
- dict.__getitem__(self, key)
+ return dict.__getitem__(self, key)
except KeyError:
- if self.default_factory is None:
- raise
- else:
- return self.default_factory()
+ return self.__missing__(key)
+ def __missing__(self, key):
+ if self.default_factory is None:
+ raise KeyError(key)
+ self[key] = value = self.default_factory()
+ return value
+ def __reduce__(self):
+ if self.default_factory is None:
+ args = tuple()
+ else:
+ args = self.default_factory,
+ return type(self), args, None, None, self.items()
+ 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))
from collections import *
Show replies by date