caseless dict - questions

oj ojeeves at gmail.com
Tue Jul 8 11:13:18 EDT 2008


On Jul 5, 1:57 am, Phoe6 <orsent... 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)
>         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.
>
> TIA,
> Senthil

What I think you need to do, is define a __repr__(self) method (see
http://docs.python.org/ref/customization.html)

Something like:

def __repr__(self):
    return dict(self.items())

I /think/ will work. I haven't tested it though. This isn't exactly
what repr is supposed to do - evaling it won't give you the correct
object back. Defining __str__ might be a better approach.

-Oli



More information about the Python-list mailing list