Small performance improvement for NoCaseDict
This commit is contained in:
@@ -111,25 +111,32 @@ class NoCaseDict(dict):
|
|||||||
>>> print(d)
|
>>> print(d)
|
||||||
{}
|
{}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, initial_dict=None):
|
def __init__(self, initial_dict=None):
|
||||||
super().__init__(initial_dict or {})
|
super().__init__(initial_dict or {})
|
||||||
self.keymap = {k.lower(): k for k in self.keys() if k.lower() != k}
|
self.keymap = {k.lower(): k for k in self.keys() if k.lower() != k}
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
key = self.keymap.get(key.lower(), key)
|
kl = key.lower()
|
||||||
if key.lower() != key:
|
key = self.keymap.get(kl, key)
|
||||||
self.keymap[key.lower()] = key
|
if kl != key:
|
||||||
|
self.keymap[kl] = key
|
||||||
super().__setitem__(key, value)
|
super().__setitem__(key, value)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return super().__getitem__(self.keymap.get(key.lower(), key))
|
kl = key.lower()
|
||||||
|
return super().__getitem__(self.keymap.get(kl, kl))
|
||||||
|
|
||||||
def __delitem__(self, key):
|
def __delitem__(self, key):
|
||||||
super().__delitem__(self.keymap.get(key.lower(), key))
|
kl = key.lower()
|
||||||
|
super().__delitem__(self.keymap.get(kl, kl))
|
||||||
|
|
||||||
def __contains__(self, key):
|
def __contains__(self, key):
|
||||||
return self.keymap.get(key.lower(), key) in self.keys()
|
kl = key.lower()
|
||||||
|
return self.keymap.get(kl, kl) in self.keys()
|
||||||
|
|
||||||
|
def get(self, key, default=None):
|
||||||
|
kl = key.lower()
|
||||||
|
return super().get(self.keymap.get(kl, kl), default)
|
||||||
|
|
||||||
|
|
||||||
class MultiDict(dict):
|
class MultiDict(dict):
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ class TestMultiDict(unittest.TestCase):
|
|||||||
self.assertEqual(d['One'], 4)
|
self.assertEqual(d['One'], 4)
|
||||||
self.assertEqual(d['ONE'], 4)
|
self.assertEqual(d['ONE'], 4)
|
||||||
self.assertEqual(d['onE'], 4)
|
self.assertEqual(d['onE'], 4)
|
||||||
|
self.assertEqual(d['two'], 5)
|
||||||
|
self.assertEqual(d['tWO'], 5)
|
||||||
|
self.assertEqual(d.get('one'), 4)
|
||||||
|
self.assertEqual(d.get('One'), 4)
|
||||||
|
self.assertEqual(d.get('ONE'), 4)
|
||||||
|
self.assertEqual(d.get('onE'), 4)
|
||||||
|
self.assertEqual(d.get('two'), 5)
|
||||||
|
self.assertEqual(d.get('tWO'), 5)
|
||||||
self.assertIn(('One', 4), list(d.items()))
|
self.assertIn(('One', 4), list(d.items()))
|
||||||
self.assertIn(('two', 5), list(d.items()))
|
self.assertIn(('two', 5), list(d.items()))
|
||||||
self.assertIn(4, list(d.values()))
|
self.assertIn(4, list(d.values()))
|
||||||
|
|||||||
Reference in New Issue
Block a user