On Sat, 19 Mar 2005 07:13:15 -0500, Kent Johnson <[EMAIL PROTECTED]> wrote:
>Bengt Richter wrote: >> On Sat, 19 Mar 2005 01:24:57 GMT, "Raymond Hettinger" <[EMAIL PROTECTED]> >> wrote: >> >>>I would like to get everyone's thoughts on two new dictionary methods: >>> >>> def count(self, value, qty=1): >>> try: >>> self[key] += qty >>> except KeyError: >>> self[key] = qty >>> >>> def appendlist(self, key, *values): >>> try: >>> self[key].extend(values) >>> except KeyError: >>> self[key] = list(values) >>> >> How about an efficient duck-typing value-incrementer to replace both? E.g. >> functionally like: >> >> >>> class xdict(dict): >> ... def valadd(self, key, incr=1): >> ... try: self[key] = self[key] + type(self[key])(incr) >> ... except KeyError: self[key] = incr > >A big problem with this is that there are reasonable use cases for both > d.count(key, <some integer>) >and > d.appendlist(key, <some integer>) > >Word counting is an obvious use for the first. Consolidating a list of key, >value pairs where the >values are ints requires the second. > >Combining count() and appendlist() into one function eliminates the second >possibility. I don't see a "big problem" ;-) d.addval doesn't eliminate the functionalities if you want them. You just have to spell them d.addval(key, <some integer>) and d.addval(key, [<some integer>]) respectively. My example interactive stuff in a previous post shows both of these using xd['x'] and xd.['y']: """ >>> xd = xdict() >>> xd {} Default integer 1 arg creates initial int value >>> xd.valadd('x') >>> xd {'x': 1} Explicit list arg create initial list value >>> xd.valadd('y', range(3)) >>> xd {'y': [0, 1, 2], 'x': 1} Explicit int increment adds to existing int >>> xd.valadd('x', 100) >>> xd['x'] 101 Explicit list arg extends existing list with contents of increment list which you can of course optionally use with a length-1 list to achieve the .append effect >>> xd.valadd('y', range(3,6)) >>> xd['y'] [0, 1, 2, 3, 4, 5] """ Granted, d.appendlist will result in more efficient code, since the temp list arg [<some integer>] does not have to be created and the type of the existing dict value does not have to be tested as generally. OTOH, you can create and extend tuple or even custom object values using valadd, and extend with alternate sequences that get converted to the existing type if its contructor knows how to accept alternatives. So I think you are not prevented from doing anything. IMO Raymond's Zen concerns are the ones to think about first, and then efficiency, which was one of the motivators in the first place ;-) Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list