best practices: is collections.defaultdict my friend or not?
MRAB
python at mrabarnett.plus.com
Fri Mar 5 21:26:39 EST 2010
Pete Emerson wrote:
> I've been wrestling with dicts. I hope at the very least what I
> discovered helps someone else out, but I'm interested in hearing from
> more learned python users.
>
> I found out that adding a two dimensional element without defining
> first dimension existing doesn't work:
>
>>>> data = {}
>>>> data['one']['two'] = 'three'
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> KeyError: 'one'
>>>> data['one'] = {}
>>>> data['one']['two'] = 'three'
>>>> print data
> {'one': {'two': 'three'}}
>
> And through some research, I discovered collections.defaultdict (new
> in Python 2.5, FWIW):
>
>>>> import collections
>>>> data = collections.defaultdict(dict)
>>>> data['one']['two'] = 'three'
>>>> print data
> defaultdict(<type 'dict'>, {'one': {'two': 'three'}})
>
> Why isn't the behavior of collections.defaultdict the default for a
> dict?
> Am I just revelling in my bad perl habits by not wanting to declare a
> previous level first?
> Is this sort of "more rigid" way of doing things common throughout
> python, and is it best that I not fight it, but embrace it?
>
> Your thoughts and comments are very much appreciated. I think my brain
> already knows some of the answers, but my heart ... well, perl and I
> go way back. Loving python so far, though.
>
Someone once wrote about a case where he was porting a frontend from
Perl to Python. It called a backend and parsed the result. Sometimes
converting one of the fields to a number would raise a ValueError
because it would contain "ERR" instead of a number, which Perl, of
course, would silently convert to 0!
Python is all about refusing to guess, and complaining if there's an
error. :-)
More information about the Python-list
mailing list