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

Walter Dörwald walter at livinglogic.de
Sat Feb 18 10:44:15 CET 2006


Guido van Rossum wrote:

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

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

Another option would be: d = {} d.defaultfactory = set d.getdefault(key).add(value) Unlike .setdefault, this would use a factory associated with the dictionary, 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 functionality 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 PyDictGetItem() -- 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 onmissing() 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 various 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 on_missing()/default_factory can change the behaviour of getitem, which upto now has been something simple and understandable. Why don't we put the on_missing()/default_factory functionality into get() instead?

d.get(key, default) does what it did before. d.get(key) invokes on_missing() (and dict would have default_factory == type(None))

Bye, Walter Dörwald



More information about the Python-Dev mailing list