Guido van Rossum wrote: > On 2/17/06, Ian Bicking <[EMAIL PROTECTED]> wrote: >> Guido van Rossum wrote: >> > d = {} >> > d.default_factory = set >> > ... >> > d[key].add(value) >> >> Another option would be: >> >> d = {} >> d.default_factory = set >> d.get_default(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. >> >> "get_default" 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 > 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 -- so what to do if > on_missing() 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 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.
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 _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com