duck typing at will
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Tue Dec 30 13:55:53 EST 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
HTH
More information about the Python-list
mailing list