[Python-Dev] Proposal: defaultdict
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 PyDict_GetItem() -- it would make sense if this also called
> on_missing(), 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
> on_missing() 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 on_missing() 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