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

Reply via email to