8000 Remove DictMixin which is superceded by collections.MutableMapping · python/cpython@edf3b73 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit edf3b73

Browse files
committed
Remove DictMixin which is superceded by collections.MutableMapping
1 parent d190f9c commit edf3b73

File tree

6 files changed

+10
-261
lines changed

6 files changed

+10
-261
lines changed

Doc/library/userdict.rst

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,24 +52,6 @@ provide the following attribute:
5252
A real dictionary used to store the contents of the :class:`UserDict` class.
5353

5454

55-
.. class:: DictMixin()
56-
57-
Mixin defining all dictionary methods for classes that already have a minimum
58-
dictionary interface including :meth:`__getitem__`, :meth:`__setitem__`,
59-
:meth:`__delitem__`, and :meth:`keys`.
60-
61-
This mixin should be used as a superclass. Adding each of the above methods
62-
adds progressively more functionality. For instance, defining all but
63-
:meth:`__delitem__` will preclude only :meth:`pop` and :meth:`popitem` from the
64-
full interface.
65-
66-
In addition to the four base methods, progressively more efficiency comes
67-
with defining :meth:`__contains__` and :meth:`__iter__`.
68-
69-
Since the mixin has no knowledge of the subclass constructor, it does not define
70-
:meth:`__init__` or :meth:`copy`.
71-
72-
7355
:mod:`UserList` --- Class wrapper for list objects
7456
==================================================
7557

Lib/UserDict.py

Lines changed: 0 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -79,103 +79,3 @@ def fromkeys(cls, iterable, value=None):
7979
class IterableUserDict(UserDict):
8080
def __iter__(self):
8181
return iter(self.data)
82-
83-
class DictMixin:
84-
# Mixin defining all dictionary methods for classes that already have
85-
# a minimum dictionary interface including getitem, setitem, delitem,
86-
# and keys. Without knowledge of the subclass constructor, the mixin
87-
# does not define __init__() or copy(). In addition to the four base
88-
# methods, progressively more efficiency comes with defining
89-
# __contains__(), __iter__(), and iteritems().
90-
91-
# XXX It would make more sense to expect __iter__ to be primitive.
92-
93-
# second level definitions support higher levels
94-
def __iter__(self):
95-
for k in self.keys():
96-
yield k
97-
def __contains__(self, key):
98-
try:
99-
value = self[key]
100-
except KeyError:
101-
return False
102-
return True
103-
104-
# third level takes advantage of second level definitions
105-
def iterkeys(self):
106-
return self.__iter__()
107-
def iteritems(self):
108-
for k in self:
109-
yield (k, self[k])
110-
111-
# fourth level uses definitions from lower levels
112-
def itervalues(self):
113-
for _, v in self.iteritems():
114-
yield v
115-
def values(self):
116-
return [v for _, v in self.iteritems()]
117-
def items(self):
118-
return list(self.iteritems())
11 9E88 9-
def clear(self):
120-
for key in list(self.iterkeys()):
121-
del self[key]
122-
def setdefault(self, key, default=None):
123-
try:
124-
return self[key]
125-
except KeyError:
126-
self[key] = default
127-
return default
128-
def pop(self, key, *args):
129-
if len(args) > 1:
130-
raise TypeError("pop expected at most 2 arguments, got "
131-
+ repr(1 + len(args)))
132-
try:
133-
value = self[key]
134-
except KeyError:
135-
if args:
136-
return args[0]
137-
raise
138-
del self[key]
139-
return value
140-
def popitem(self):
141-
try:
142-
k, v = next(self.iteritems())
143-
except StopIteration:
144-
raise KeyError('container is empty')
145-
del self[k]
146-
return (k, v)
147-
def update(self, other=None, **kwargs):
148-
# Make progressively weaker assumptions about "other"
149-
if other is None:
150-
pass
151-
elif hasattr(other, 'iteritems'): # iteritems saves memory and lookups
152-
for k, v in other.iteritems():
153-
self[k] = v
154-
elif hasattr(other, 'items'): # items may also save memory and lookups
155-
for k, v in other.items():
156-
self[k] = v
157-
elif hasattr(other, 'keys'):
158-
for k in other.keys():
159-
self[k] = other[k]
160-
else:
161-
for k, v in other:
162-
self[k] = v
163-
if kwargs:
164-
self.update(kwargs)
165-
def get(self, key, default=None):
166-
try:
167-
return self[key]
168-
except KeyError:
169-
return default
170-
def __repr__(self):
171-
return repr(dict(self.iteritems()))
172-
def __eq__(self, other):
173-
if isinstance(other, DictMixin):
174-
other = dict(other.iteritems())
175-
return dict(self.iteritems()) == other
176-
def __ne__(self, other):
177-
if isinstance(other, DictMixin):
178-
other = dict(other.iteritems())
179-
return dict(self.iteritems()) != other
180-
def __len__(self):
181-
return len(self.keys())

Lib/bsddb/dbshelve.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
import pickle
3333
import sys
3434

35-
#At version 2.3 cPickle switched to using protocol instead of bin and
36-
#DictMixin was added
35+
#At version 2.3 cPickle switched to using protocol instead of bin
3736
if sys.version_info[:3] >= (2, 3, 0):
3837
HIGHEST_PROTOCOL = pickle.HIGHEST_PROTOCOL
3938
def _dumps(object, protocol):

Lib/test/test_shelve.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
import shelve
33
import glob
44
from test import test_support
5-
from UserDict import DictMixin
5+
from collections import MutableMapping
66
from test.test_anydbm import dbm_iterator
77

88
def L1(s):
99
return s.decode("latin-1")
1010

11-
class byteskeydict(DictMixin):
11+
class byteskeydict(MutableMapping):
1212
"Mapping that supports bytes keys"
1313

1414
def __init__(self):
@@ -23,10 +23,15 @@ def __setitem__(self, key, value):
2323
def __delitem__(self, key):
2424
del self.d[L1(key)]
2525

26+
def __len__(self):
27+
return len(self.d)
28+
2629
def iterkeys(self):
2730
for k in self.d.keys():
2831
yield k.encode("latin-1")
2932

33+
__iter__ = iterkeys
34+
3035
def keys(self):
3136
return list(self.iterkeys())
3237

Lib/test/test_userdict.py

Lines changed: 0 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -194,150 +194,11 @@ class G(UserDict.UserDict):
194194
else:
195195
self.fail("g[42] didn't raise KeyError")
196196

197-
##########################
198-
# Test Dict Mixin
199197

200-
class SeqDict(UserDict.DictMixin):
201-
"""Dictionary lookalike implemented with lists.
202-
203-
Used to test and demonstrate DictMixin
204-
"""
205-
def __init__(self, other=None, **kwargs):
206-
self.keylist = []
207-
self.valuelist = []
208-
if other is not None:
209-
for (key, value) in other:
210-
self[key] = value
211-
for (key, value) in kwargs.items():
212-
self[key] = value
213-
def __getitem__(self, key):
214-
try:
215-
i = self.keylist.index(key)
216-
except ValueError:
217-
raise KeyError
218-
return self.valuelist[i]
219-
def __setitem__(self, key, value):
220-
try:
221-
i = self.keylist.index(key)
222-
self.valuelist[i] = value
223-
except ValueError:
224-
self.keylist.append(key)
225-
self.valuelist.append(value)
226-
def __delitem__(self, key):
227-
try:
228-
i = self.keylist.index(key)
229-
except ValueError:
230-
raise KeyError
231-
self.keylist.pop(i)
232-
self.valuelist.pop(i)
233-
def keys(self):
234-
return list(self.keylist)
235-
def copy(self):
236-
d = self.__class__()
237-
for key, value in self.items():
238-
d[key] = value
239-
return d
240-
@classmethod
241-
def fromkeys(cls, keys, value=None):
242-
d = cls()
243-
for key in keys:
244-
d[key] = value
245-
return d
246-
247-
class UserDictMixinTest(mapping_tests.TestMappingProtocol):
248-
type2test = SeqDict
249-
250-
def test_all(self):
251-
## Setup test and verify working of the test class
252-
253-
# check init
254-
s = SeqDict()
255-
256-
# exercise setitem
257-
s[10] = 'ten'
258-
s[20] = 'twenty'
259-
s[30] = 'thirty'
260-
261-
# exercise delitem
262-
del s[20]
263-
# check getitem and setitem
264-
self.assertEqual(s[10], 'ten')
265-
# check keys() and delitem
266-
self.assertEqual(s.keys(), [10, 30])
267-
268-
## Now, test the DictMixin methods one by one
269-
270-
# __contains__
271-
self.assert_(10 in s)
272-
self.assert_(20 not in s)
273-
274-
# __iter__
275-
self.assertEqual([k for k in s], [10, 30])
276-
277-
# __len__
278-
self.assertEqual(len(s), 2)
279-
280-
# iteritems
281-
self.assertEqual(list(s.items()), [(10,'ten'), (30, 'thirty')])
282-
283-
# iterkeys
284-
self.assertEqual(list(s.keys()), [10, 30])
285-
286-
# itervalues
287-
self.assertEqual(list(s.values()), ['ten', 'thirty'])
288-
289-
# values
290-
self.assertEqual(s.values(), ['ten', 'thirty'])
291-
292-
# items
293-
self.assertEqual(s.items(), [(10,'ten'), (30, 'thirty')])
294-
295-
# get
296-
self.assertEqual(s.get(10), 'ten')
297-
self.assertEqual(s.get(15,'fifteen'), 'fifteen')
298-
self.assertEqual(s.get(15), None)
299-
300-
# setdefault
301-
self.assertEqual(s.setdefault(40, 'forty'), 'forty')
302-
self.assertEqual(s.setdefault(10, 'null'), 'ten')
303-
del s[40]
304-
305-
# pop
306-
self.assertEqual(s.pop(10), 'ten')
307-
self.assert_(10 not in s)
308-
s[10] = 'ten'
309-
self.assertEqual(s.pop("x", 1), 1)
310-
s["x"] = 42
311-
self.assertEqual(s.pop("x", 1), 42)
312-
313-
# popitem
314-
k, v = s.popitem()
315-
self.assert_(k not in s)
316-
s[k] = v
317-
318-
# clear
319-
s.clear()
320-
self.assertEqual(len(s), 0)
321-
322-
# empty popitem
323-
self.assertRaises(KeyError, s.popitem)
324-
325-
# update
326-
s.update({10: 'ten', 20:'twenty'})
327-
self.assertEqual(s[10], 'ten')
328-
self.assertEqual(s[20], 'twenty')
329-
330-
# cmp
331-
self.assertEqual(s, {10: 'ten', 20:'twenty'})
332-
t = SeqDict()
333-
t[20] = 'twenty'
334-
t[10] = 'ten'
335-
self.assertEqual(s, t)
336198

337199
def test_main():
338200
test_support.run_unittest(
339201
UserDictTest,
340-
UserDictMixinTest
341202
)
342203

343204
if __name__ == "__main__":

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ Extension Modules
7070
Library
7171
-------
7272

73+
- Removed UserDict.DictMixin. Replaced all its uses with collections.MutableMapping.
74+
7375
- Issue #1703: getpass() should flush after writing prompt.
7476

7577
- Issue #1585: IDLE uses non-existent xrange() function.

0 commit comments

Comments
 (0)
0