Question about collections.defaultdict

Steven W. Orr steveo at syslang.net
Mon Mar 26 17:33:32 CEST 2012


On 3/26/2012 9:44 AM, Robert Kern wrote:
> On 3/26/12 2:33 PM, Steven W. Orr wrote:
>> I created a new class called CaseInsensitiveDict (by stealing from code I found
>> on the web, thank you very much). The new class inherits from dict. It makes it
>> so that if the key has a 'lower' method, it will always access the key using
>> lower
>>
>> I'd like to change the place where I previously declared a dict
>>
>> self.lookup = defaultdict(list)
>>
>> so that the new code will allow this new dict to be used instead. But then I
>> realized I may have painted myself into a small corner:
>>
>> Is there a way to use defaultdict so that I can override what *kind* of dict it
>> will use?
>
> No.
>
>> I would like the value to still be a list be default, but it seems like I can't
>> tell defaultdict to use *my* new dict.
>>
>> Do I give up on defaultdict?
>
> Assuming that your CaseInsensitiveDict subclasses from dict or UserDict, it's
> relatively easy to make a subclass of your CaseInsensitiveDict act like a
> defaultdict. Just implement the __missing__(key) method appropriately (and
> modify the constructor to take the callable, of course).
>
> http://docs.python.org/library/stdtypes.html#dict
> http://docs.python.org/library/collections.html#collections.defaultdict.__missing__
>
>

I'm not quite getting what you're telling me, but I'm sure you have the right 
idea. Here's the beginning of my class:

class CaseInsensitiveDict(dict):
     def __init__(self, init=None):
         if isinstance(init, (dict, list, tuple)):
             for kk, vv in init.items():
                 self[self.key_has_lower(kk)] = vv


It sounds like you want me to subclass defaultdict to create something like this?

class CaseInsensitiveDictDef(defaultdict):
     def __init__(self, init=None):
         super(CaseInsensitiveDictDef, self).__init__(list)
         self.__missing__ = list

I think I'm way off base. I'm not clear on what the calling sequence is for 
defaultdict or how to get it to  use my CaseInsensitiveDict instead of regular 
dict.

Can you help?

-- 
Time flies like the wind. Fruit flies like a banana. Stranger things have  .0.
happened but none stranger than this. Does your driver's license say Organ ..0
Donor?Black holes are where God divided by zero. Listen to me! We are all- 000
individuals! What if this weren't a hypothetical question?
steveo at syslang.net



More information about the Python-list mailing list