> Another option with no storage overhead which goes part way to reducing > the awkwardness would be to provide a decorator class accessible through > dict. The decorator class would take a value or function to be used as > the default, but apart from __getitem__ would simply forward all other > methods through to the underlying dictionary.
I'm not sure I like the decorator -- I would never use that flexibility to have more than one default. I can't come up with any reason to ever use that. I think it works best as a simple subclass: class DefaultDict(dict): def __init__(self, default, *args, **kwargs): dict.__init__(self, *args, **kwargs) self.default = default def __getitem__(self, key): return self.setdefault(key, copy.copy(self.default)) d = DefaultDict(0) for x in [1, 3, 1, 2, 2, 3, 3, 3, 3]: d[x] += 1 pprint(d) d = DefaultDict([]) for i, x in enumerate([1, 3, 1, 2, 2, 3, 3, 3, 3]): d[x].append(i) pprint(d) Output: {1: 2, 2: 2, 3: 5} {1: [0, 2], 2: [3, 4], 3: [1, 5, 6, 7, 8]} -- http://mail.python.org/mailman/listinfo/python-list