On Sat, 18 Feb 2006 10:44:15 +0100 (CET), "=?iso-8859-1?Q?Walter_D=F6rwald?=" <[EMAIL PROTECTED]> wrote:
>Guido van Rossum wrote: >> On 2/17/06, Ian Bicking <[EMAIL PROTECTED]> wrote: >>> Guido van Rossum wrote: >>> > d =3D {} >>> > d.default_factory =3D set >>> > ... >>> > d[key].add(value) >>> >>> Another option would be: >>> >>> d =3D {} >>> d.default_factory =3D set >>> d.get_default(key).add(value) >>> >>> Unlike .setdefault, this would use a factory associated with the diction= >ary, 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 functio= >nality 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 P= >yDict_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_m= >issing() 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 v= >arious 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 beha= >viour 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 =3D=3D type(None)) > OTOH, I forgot why it was desirable in the first place to overload d[k] with defaulting logic. E.g., why wouldn't d.defaulting[k] be ok to write when you want the d.default_factory action? on_missing feels more like a tracing hook though, so maybe it could always act either way if defined. Also, for those wanting to avoid lambda:42 as factory, would a callable test cost a lot? Of course then the default_factory name might require revision. Regards, Bengt Richter _______________________________________________ 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