Guido van Rossum wrote: > On 2/17/06, Ian Bicking <ianb at colorstudy.com> 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
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4