94 lines
2.4 KiB
Python
94 lines
2.4 KiB
Python
|
# -*- coding: latin-1 -*-
|
||
|
|
||
|
class CaselessDict(dict):
|
||
|
"""
|
||
|
A dictionary that isn't case sensitive, and only use string as keys.
|
||
|
|
||
|
>>> ncd = CaselessDict(key1='val1', key2='val2')
|
||
|
>>> ncd
|
||
|
CaselessDict({'KEY2': 'val2', 'KEY1': 'val1'})
|
||
|
>>> ncd['key1']
|
||
|
'val1'
|
||
|
>>> ncd['KEY1']
|
||
|
'val1'
|
||
|
>>> ncd['KEY3'] = 'val3'
|
||
|
>>> ncd['key3']
|
||
|
'val3'
|
||
|
>>> ncd.setdefault('key3', 'FOUND')
|
||
|
'val3'
|
||
|
>>> ncd.setdefault('key4', 'NOT FOUND')
|
||
|
'NOT FOUND'
|
||
|
>>> ncd['key4']
|
||
|
'NOT FOUND'
|
||
|
>>> ncd.get('key1')
|
||
|
'val1'
|
||
|
>>> ncd.get('key3', 'NOT FOUND')
|
||
|
'val3'
|
||
|
>>> ncd.get('key4', 'NOT FOUND')
|
||
|
'NOT FOUND'
|
||
|
>>> 'key4' in ncd
|
||
|
True
|
||
|
>>> del ncd['key4']
|
||
|
>>> ncd.has_key('key4')
|
||
|
False
|
||
|
>>> ncd.update({'key5':'val5', 'KEY6':'val6', 'KEY5':'val7'})
|
||
|
>>> ncd['key6']
|
||
|
'val6'
|
||
|
>>> keys = ncd.keys()
|
||
|
>>> keys.sort()
|
||
|
>>> keys
|
||
|
['KEY1', 'KEY2', 'KEY3', 'KEY5', 'KEY6']
|
||
|
"""
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
"Set keys to upper for initial dict"
|
||
|
dict.__init__(self, *args, **kwargs)
|
||
|
for k,v in self.items():
|
||
|
k_upper = k.upper()
|
||
|
if k != k_upper:
|
||
|
dict.__delitem__(self, k)
|
||
|
self[k_upper] = v
|
||
|
|
||
|
def __getitem__(self, key):
|
||
|
return dict.__getitem__(self, key.upper())
|
||
|
|
||
|
def __setitem__(self, key, value):
|
||
|
dict.__setitem__(self, key.upper(), value)
|
||
|
|
||
|
def __delitem__(self, key):
|
||
|
dict.__delitem__(self, key.upper())
|
||
|
|
||
|
def __contains__(self, item):
|
||
|
return dict.__contains__(self, item.upper())
|
||
|
|
||
|
def get(self, key, default=None):
|
||
|
return dict.get(self, key.upper(), default)
|
||
|
|
||
|
def setdefault(self, key, value=None):
|
||
|
return dict.setdefault(self, key.upper(), value)
|
||
|
|
||
|
def pop(self, key, default=None):
|
||
|
return dict.pop(self, key.upper(), default)
|
||
|
|
||
|
def popitem(self):
|
||
|
return dict.popitem(self)
|
||
|
|
||
|
def has_key(self, key):
|
||
|
return dict.has_key(self, key.upper())
|
||
|
|
||
|
def update(self, indict):
|
||
|
"""
|
||
|
Multiple keys where key1.upper() == key2.upper() will be lost.
|
||
|
"""
|
||
|
for entry in indict:
|
||
|
self[entry] = indict[entry]
|
||
|
|
||
|
def copy(self):
|
||
|
return CaselessDict(dict.copy(self))
|
||
|
|
||
|
def clear(self):
|
||
|
dict.clear(self)
|
||
|
|
||
|
def __repr__(self):
|
||
|
return 'CaselessDict(' + dict.__repr__(self) + ')'
|