caseless dict - questions

David C. Ullrich dullrich at sprynet.com
Mon Jul 7 16:59:10 EDT 2008


In article 
<77798300-820f-4175-a9cb-aef639d42a32 at m45g2000hsb.googlegroups.com>,
 Phoe6 <orsenthil at gmail.com> wrote:

> I have a requirement for using caseless dict. I searched the web for
> many different implementations and found one snippet which was
> implemented in minimal and useful way.
> 
> #############
> import UserDict
> 
> class CaseInsensitiveDict(dict, UserDict.DictMixin):
>     def __init__(self, *args, **kwargs):
>         self.orig = {}
>         super(CaseInsensitiveDict, self).__init__(*args, **kwargs)
>     def items(self):
>         keys = dict.keys(self)
>         values = dict.values(self)

This items() can't be what anyone would want items
to be for a "caseless dict".

>         return [(self.orig[k],v) for k in keys for v in values]
>     def __setitem__(self, k, v):
>         hash_val = hash(k.lower())
>         self.orig[hash_val] = k
>         dict.__setitem__(self, hash_val, v)
>     def __getitem__(self, k):
>         return dict.__getitem__(self, hash(k.lower()))
> 
> 
> obj = CaseInsensitiveDict()
> obj['Name'] = 'senthil'
> print obj
> print obj.items()
> 
> obj1 = {}
> obj1['Name'] = 'senthil'
> print obj1
> print obj1.items()
> ###########
> [ors at goofy python]$ python cid1.py
> {15034981: 'senthil'}
> [('Name', 'senthil')]
> {'Name': 'senthil'}
> [('Name', 'senthil')]
> 
> ---
> The difference between the Caselessdict and {} is that when called as
> the object, the Caselessdict() is giving me the internal
> representation.
> obj = CaseInsensitiveDict()
> obj['Name'] = 'senthil'
> print obj
> gives: {15034981: 'senthil'}
> 
> obj1 = {}
> obj1['Name'] = 'senthil'
> print obj1
> Correctly gives {'Name': 'senthil'}
> 
> What changes should I make to CaseInsensitiveDict ( written above), so
> that its instance gives the actual dictionary instead of its internal
> representation.
> Constructing a dictionary and returning from __init__ method did not
> work.

It's not entirely clear to me what you want:
Since this is supposed to be a "caseless" dict,
I imagine that if you say

d['Name'] = 'first value'
d['name'] = 'new value'

then d['Name'] should now be 'new value'. Fine.
Now in that case exactly what do you want to see
when you print d? Do you want to see {'name':'new value'}
or {'name':'new value', 'Name': 'newvalue'}?

> TIA,
> Senthil

-- 
David C. Ullrich



More information about the Python-list mailing list