duck typing at will

Bruno Desthuilliers bdesth.quelquechose at
Tue Dec 30 19:55:53 CET 2008

Jose Mora a écrit :
> Duck typing is called that way because "If it looks like a duck and
> quacks like a duck, it must be a duck."

or at least something close enough...

> I think it would be good to
> have also "If the programmer wants to deal with it like a duck, it
> must be a duck"

DWIM[1] just doesn't work. No parser can read your mind, and the harder 
they try, the more bugs they are likely to cause. IOW : cows neither 
look nor quack like ducks, and asking a cow to quack just won't turn 
your cow into a duck.

[1] Do What I Mean

> I mean, some tasks are rather boring in python when compared with php,

Possibly. OTHO, and from years of experience with both languages, a lot 
of tasks are way more boring in php when compared to Python.

> for example, let's imagine we have a dictionary that contains
> dictionaries that contain the times that a key appears. We, or at
> least I, would like to write something as short as:
> dict[k1][k2] += 1
> However we will have to do a longer code (this is the smallest code I
> could come up with):

>     dict = {}

bad identifier - it shadows the builtin dict type.

>     if not k1 in dict:
>       dict[k1] = {}
>     if not k2 in dict[k1]:
>       dict[k1][k2] = 0
>     dict[k1][k2] += 1

What about:

from collections import defaultdict
d = defaultdict(lambda: defaultdict(int))

for k1, k2 in whatever:
     d[k1][k2] += 1

NB : this requires a "recent" Python version (works on 2.5.1 at least). 
Else, yes, this will be a bit more "boring":

d = dict()
for k1, k2 in whatever:
     d2 = d.setdefault(k1, dict())
     d2[k2] = d2.get(k2, 0) + 1


More information about the Python-list mailing list