Small performance improvement for NoCaseDict

This commit is contained in:
Miguel Grinberg
2022-09-24 15:37:52 +01:00
parent 8ebe81c09b
commit a8515c97b0
2 changed files with 22 additions and 7 deletions

View File

@@ -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):

View File

@@ -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()))