On Jun 3, 9:11 pm, Matthew Wilson <[EMAIL PROTECTED]> wrote: > I used defaultdict.fromkeys to make a new defaultdict instance, but I > was surprised by behavior: > > >>> b = defaultdict.fromkeys(['x', 'y'], list) > > >>> b > defaultdict(None, {'y': <type 'list'>, 'x': <type 'list'>}) > > >>> b['x'] > <type 'list'> > > >>> b['z'] > ------------------------------------------------------------ > Traceback (most recent call last): > File "<ipython console>", line 1, in <module> > KeyError: 'z' > > I think that what is really going on is that fromdict makes a regular > dictionary, and then hands it off to the defaultdict class. > > I find this confusing, because now I have a defaultdict that raises a > KeyError. > > Do other people find this intuitive? > > Would it be better if defaultdict.fromkeys raised a > NotImplementedException? > > Or would it be better to redefine how defaultdict.fromkeys works, so > that it first creates the defaultdict, and then goes through the keys? > > All comments welcome. If I get some positive feedback, I'm going to try > to submit a patch. > The statement:
b = defaultdict.fromkeys(['x', 'y'], list) is equivalent to: b = defaultdict() for i in ['x', 'y']: b[i] = list so there's no default_factory and therefore the defaultdict will behave like a dict. Perhaps there could be an optional third argument to provide a default_factory. -- http://mail.python.org/mailman/listinfo/python-list