Skip to content

Commit 2a2cef3

Browse files
committed
cidict: Rewrite in terms of MutableMapping
The UserDict API is not specified when it comes to extending: it is not clear which methods can be safely overridden. The MutableMapping ABC fixes this problem by providing an explicit set of abstract methods, in terms of which the rest of the API is implemented. Switch to using MutableMapping for cidict.
1 parent c803bfc commit 2a2cef3

File tree

1 file changed

+36
-35
lines changed

1 file changed

+36
-35
lines changed

Lib/ldap/cidict.py

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,57 +5,58 @@
55
66
See https://www.python-ldap.org/ for details.
77
"""
8+
from collections import MutableMapping
89
import warnings
910

1011
from ldap import __version__
1112

12-
from ldap.compat import IterableUserDict
1313

14+
class cidict(MutableMapping):
15+
"""
16+
Case-insensitive but case-respecting dictionary.
17+
"""
1418

15-
class cidict(IterableUserDict):
16-
"""
17-
Case-insensitive but case-respecting dictionary.
18-
"""
19+
def __init__(self, default=None):
20+
self._keys = {}
21+
self._data = {}
22+
if default:
23+
self.update(default)
24+
25+
# MutableMapping abstract methods
1926

20-
def __init__(self,default=None):
21-
self._keys = {}
22-
IterableUserDict.__init__(self,{})
23-
self.update(default or {})
27+
def __getitem__(self, key):
28+
return self._data[key.lower()]
2429

25-
def __getitem__(self,key):
26-
return self.data[key.lower()]
30+
def __setitem__(self, key, value):
31+
lower_key = key.lower()
32+
self._keys[lower_key] = key
33+
self._data[lower_key] = value
2734

28-
def __setitem__(self,key,value):
29-
lower_key = key.lower()
30-
self._keys[lower_key] = key
31-
self.data[lower_key] = value
35+
def __delitem__(self, key):
36+
lower_key = key.lower()
37+
del self._keys[lower_key]
38+
del self._data[lower_key]
3239

33-
def __delitem__(self,key):
34-
lower_key = key.lower()
35-
del self._keys[lower_key]
36-
del self.data[lower_key]
40+
def __iter__(self):
41+
return iter(self._keys.values())
3742

38-
def update(self,dict):
39-
for key, value in dict.items():
40-
self[key] = value
43+
def __len__(self):
44+
return len(self._keys)
4145

42-
def has_key(self,key):
43-
return key in self
46+
# Specializations for performance
4447

45-
def __contains__(self,key):
46-
return IterableUserDict.__contains__(self, key.lower())
48+
def __contains__(self, key):
49+
return key.lower() in self._keys
4750

48-
def __iter__(self):
49-
return iter(self.keys())
51+
def clear(self):
52+
self._keys.clear()
53+
self._data.clear()
5054

51-
def keys(self):
52-
return self._keys.values()
55+
# Backwards compatibility
5356

54-
def items(self):
55-
result = []
56-
for k in self._keys.values():
57-
result.append((k,self[k]))
58-
return result
57+
def has_key(self, key):
58+
"""Compatibility with python-ldap 2.x"""
59+
return key in self
5960

6061

6162
def strlist_minus(a,b):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy