From d81206d1526f869645bca83193da5ddfefaf4936 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 15 Feb 2007 03:49:08 +0000 Subject: [PATCH] Fix the damage to UserDict and its tests. Clearly this is not the right way to fix this; UserDict and MixinDict ought to be redesigned with the new dict API in mind. But I'm not claiming to be in charge of library redesign, I only want zero failing tests. --- Lib/UserDict.py | 27 +++++++++++++-------------- Lib/test/mapping_tests.py | 6 +++--- Lib/test/test_userdict.py | 2 +- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Lib/UserDict.py b/Lib/UserDict.py index fa1deec9888..7570cef8c2b 100644 --- a/Lib/UserDict.py +++ b/Lib/UserDict.py @@ -42,9 +42,6 @@ def copy(self): return c def keys(self): return self.data.keys() def items(self): return self.data.items() - def iteritems(self): return self.data.items() - def iterkeys(self): return self.data.keys() - def itervalues(self): return self.data.values() def values(self): return self.data.values() def update(self, dict=None, **kwargs): if dict is None: @@ -91,6 +88,8 @@ class DictMixin: # methods, progressively more efficiency comes with defining # __contains__(), __iter__(), and iteritems(). + # XXX It would make more sense to expect __iter__ to be primitive. + # second level definitions support higher levels def __iter__(self): for k in self.keys(): @@ -103,20 +102,20 @@ def __contains__(self, key): return True # third level takes advantage of second level definitions + def iterkeys(self): + return self.__iter__() def iteritems(self): for k in self: yield (k, self[k]) - def iterkeys(self): - return self.__iter__() # fourth level uses definitions from lower levels def itervalues(self): - for _, v in self.items(): + for _, v in self.iteritems(): yield v def values(self): - return [v for _, v in self.items()] + return [v for _, v in self.iteritems()] def items(self): - return list(self.items()) + return list(self.iteritems()) def clear(self): for key in self.keys(): del self[key] @@ -140,7 +139,7 @@ def pop(self, key, *args): return value def popitem(self): try: - k, v = self.items().next() + k, v = self.iteritems().next() except StopIteration: raise KeyError, 'container is empty' del self[k] @@ -169,14 +168,14 @@ def get(self, key, default=None): except KeyError: return default def __repr__(self): - return repr(dict(self.items())) + return repr(dict(self.iteritems())) def __eq__(self, other): if isinstance(other, DictMixin): - other = dict(other.items()) - return dict(self.items()) == other + other = dict(other.iteritems()) + return dict(self.iteritems()) == other def __ne__(self, other): if isinstance(other, DictMixin): - other = dict(other.items()) - return dict(self.items()) != other + other = dict(other.iteritems()) + return dict(self.iteritems()) != other def __len__(self): return len(self.keys()) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py index a260d4f5f7f..09e9dcbe421 100644 --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -317,7 +317,7 @@ def test_bool(self): def test_keys(self): BasicTestMappingProtocol.test_keys(self) d = self._empty_mapping() - self.assertEqual(d.keys(), []) + self.assertEqual(list(d.keys()), []) d = self._full_mapping({'a': 1, 'b': 2}) k = d.keys() self.assert_('a' in k) @@ -327,13 +327,13 @@ def test_keys(self): def test_values(self): BasicTestMappingProtocol.test_values(self) d = self._full_mapping({1:2}) - self.assertEqual(d.values(), [2]) + self.assertEqual(list(d.values()), [2]) def test_items(self): BasicTestMappingProtocol.test_items(self) d = self._full_mapping({1:2}) - self.assertEqual(d.items(), [(1, 2)]) + self.assertEqual(list(d.items()), [(1, 2)]) def test_contains(self): d = self._empty_mapping() diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py index 05d6d9ea7ae..500971bf563 100644 --- a/Lib/test/test_userdict.py +++ b/Lib/test/test_userdict.py @@ -92,7 +92,7 @@ def display(self): print(self) # Test keys, items, values self.assertEqual(u2.keys(), d2.keys()) self.assertEqual(u2.items(), d2.items()) - self.assertEqual(u2.values(), d2.values()) + self.assertEqual(list(u2.values()), list(d2.values())) # Test "in". for i in u2.keys():