-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathcidict.py
46 lines (34 loc) · 1.2 KB
/
cidict.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
"""
A re-implementation of the ldap module's cidict that inherits from dict instead
of UserDict so that we can, in turn, inherit from cidict.
"""
class cidict(dict):
"""
Case-insensitive but case-respecting dictionary.
"""
def __init__(self, default=None):
self._keys = {}
super(cidict, self).__init__({})
self.update(default or {})
def __getitem__(self, key):
return super(cidict, self).__getitem__(key.lower())
def __setitem__(self, key, value):
lower_key = key.lower()
self._keys[lower_key] = key
super(cidict, self).__setitem__(lower_key, value)
def __delitem__(self, key):
lower_key = key.lower()
del self._keys[lower_key]
super(cidict, self).__delitem__(lower_key)
def update(self, dict):
for key in dict:
self[key] = dict[key]
def has_key(self, key):
return super(cidict, self).__contains__(key.lower())
__contains__ = has_key
def get(self, key, *args, **kwargs):
return super(cidict, self).get(key.lower(), *args, **kwargs)
def keys(self):
return self._keys.values()
def items(self):
return [(k, self[k]) for k in self.keys()]