[Python-Dev] Proposal: defaultdict (original) (raw)

Bengt Richter bokr at oz.net
Sun Feb 19 03:47:10 CET 2006


On Sat, 18 Feb 2006 10:44:15 +0100 (CET), "=?iso-8859-1?Q?Walter_D=F6rwald?=" <walter at livinglogic.de> wrote:

Guido van Rossum wrote:

On 2/17/06, Ian Bicking <ianb at colorstudy.com> wrote:

Guido van Rossum wrote: > d =3D {} > d.defaultfactory =3D set > ... > d[key].add(value)

Another option would be: d =3D {} d.defaultfactory =3D set d.getdefault(key).add(value) Unlike .setdefault, this would use a factory associated with the diction= ary, and no default value would get passed in. Unlike the proposal, this would not override getitem (not overriding getitem is really the only difference with the proposal). It would = be clear reading the code that you were not implicitly asserting they "key in d" was true. "getdefault" isn't the best name, but another name isn't jumping out at= me at the moment. Of course, it is not a Pythonic argument to say that an existing method should be overridden, or functio= nality made nameless simply because we can't think of a name (looking to anonymous functions of course ;) I'm torn. While trying to implement this I came across some ugliness in P= yDictGetItem() -- it would make sense if this also called onmissing(), but it must return a value without incrementing its refcount, and isn't supposed to raise exceptions -- so what to do if onm= issing() returns a value that's not inserted in the dict? If the getattr()-like operation that supplies and inserts a dynamic default was a separate method, we wouldn't have this problem. OTOH most reviewers here seem to appreciate onmissing() as a way to do v= arious other ways of alterning a dict's getitem() behavior behind a caller's back -- perhaps it could even be= (ab)used to implement case-insensitive lookup. I don't like the fact that onmissing()/defaultfactory can change the beha= viour of getitem, which upto now has been something simple and understandable. Why don't we put the onmissing()/defaultfactory functionality into get() = instead? d.get(key, default) does what it did before. d.get(key) invokes onmissing(= ) (and dict would have defaultfactory =3D=3D type(None)) OTOH, I forgot why it was desirable in the first place to overload d[k] with defaulting logic. E.g., why wouldn't d.defaulting[k] be ok to write when you want the d.default_factory action?

on_missing feels more like a tracing hook though, so maybe it could always act either way if defined.

Also, for those wanting to avoid lambda:42 as factory, would a callable test cost a lot? Of course then the default_factory name might require revision.

Regards, Bengt Richter



More information about the Python-Dev mailing list