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

Michael Hudson mwh at python.net
Sat Feb 18 12:44:23 CET 2006


"Guido van Rossum" <guido at python.org> writes:

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

This last bit has been a painful lie for quite some time. I don't know what can be done about it, though -- avoid the use of PyDict_GetItem() in situations where you don't expect string only dicts (so using it on globals and instance dicts would still be ok)?

-- so what to do if onmissing() returns a value that's not inserted in the dict?

Well, like some others I am a bit uncomfortable with changing the semantics of such an important operation on such an important data structure. But then I'm also not that unhappy with setdefault, so I must be weird.

If the getattr()-like operation that supplies and inserts a dynamic default was a separate method, we wouldn't have this problem.

Yes.

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.

Well, I'm not sure I do.

There seems to be quite a conceptual difference between being able to make a new kind of dictionary and mess with the behaviour of one that exists already, but I don't know if that matters in practice (the fact that you can currently do things like "import sys; sys.dict.clear()" doesn't seem to cause real problems).

Finally, I'll just note that subclassing to modify the behaviour of a builtin type has generally been actively discouraged in python so far. If all dictionary lookups went through a method that you could override in Python (i.e. subclasses could replace ma_lookup, in effect) this would be easy to do in Python code. But they don't, and bug reports suggesting that they do have been rejected in the past (and I agree with the rejection, fwiw).

So that rambled a bit. But in essence: I'd much prefer much prefer an addtion of a method or a type than modifictaion of existing behaviour.

Cheers, mwh

-- If you're talking "useful", I'm not your bot. -- Tim Peters, 08 Nov 2001



More information about the Python-Dev mailing list