python3 - 2to3 + miscell obvious tweaks
[sfa.git] / sfa / util / defaultdict.py
1 # from http://code.activestate.com/recipes/523034/
2 try:
3     from collections import defaultdict
4 except:
5     class defaultdict(dict):
6
7         def __init__(self, default_factory=None, *a, **kw):
8             if (default_factory is not None and
9                     not hasattr(default_factory, '__call__')):
10                 raise TypeError('first argument must be callable')
11             dict.__init__(self, *a, **kw)
12             self.default_factory = default_factory
13
14         def __getitem__(self, key):
15             try:
16                 return dict.__getitem__(self, key)
17             except KeyError:
18                 return self.__missing__(key)
19
20         def __missing__(self, key):
21             if self.default_factory is None:
22                 raise KeyError(key)
23             self[key] = value = self.default_factory()
24             return value
25
26         def __reduce__(self):
27             if self.default_factory is None:
28                 args = tuple()
29             else:
30                 args = self.default_factory,
31             return type(self), args, None, None, list(self.items())
32
33         def copy(self):
34             return self.__copy__()
35
36         def __copy__(self):
37             return type(self)(self.default_factory, self)
38
39         def __deepcopy__(self, memo):
40             import copy
41             return type(self)(self.default_factory,
42                               copy.deepcopy(list(self.items())))
43
44         def __repr__(self):
45             return 'defaultdict(%s, %s)' % (self.default_factory,
46                                             dict.__repr__(self))