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