diff --git a/Lib/mailbox.py b/Lib/mailbox.py index 8a25a19efce..451f8821fbb 100644 --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -103,7 +103,7 @@ class Mailbox: def itervalues(self): """Return an iterator over all messages.""" - for key in self.keys(): + for key in self.iterkeys(): try: value = self[key] except KeyError: @@ -119,7 +119,7 @@ class Mailbox: def iteritems(self): """Return an iterator over (key, message) tuples.""" - for key in self.keys(): + for key in self.iterkeys(): try: value = self[key] except KeyError: @@ -154,7 +154,7 @@ class Mailbox: def popitem(self): """Delete an arbitrary (key, message) pair and return it.""" - for key in self.keys(): + for key in self.iterkeys(): return (key, self.pop(key)) # This is only run once. else: raise KeyError('No messages in mailbox') @@ -162,7 +162,7 @@ class Mailbox: def update(self, arg=None): """Change the messages that correspond to certain keys.""" if hasattr(arg, 'iteritems'): - source = arg.items() + source = arg.iteritems() elif hasattr(arg, 'items'): source = arg.items() else: @@ -559,7 +559,7 @@ class Maildir(Mailbox): def next(self): """Return the next message in a one-time iteration.""" if not hasattr(self, '_onetime_keys'): - self._onetime_keys = iter(self.keys()) + self._onetime_keys = self.iterkeys() while True: try: return self[next(self._onetime_keys)] @@ -1078,7 +1078,7 @@ class MH(Mailbox): def __len__(self): """Return a count of messages in the mailbox.""" - return len(list(self.keys())) + return len(list(self.iterkeys())) def lock(self): """Lock the mailbox.""" @@ -1192,7 +1192,7 @@ class MH(Mailbox): sequences = self.get_sequences() prev = 0 changes = [] - for key in self.keys(): + for key in self.iterkeys(): if key - 1 != prev: changes.append((key, prev + 1)) if hasattr(os, 'link'): diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py index d40509368ac..0991f74f840 100644 --- a/Lib/test/test_mailbox.py +++ b/Lib/test/test_mailbox.py @@ -300,7 +300,7 @@ class TestMailbox(TestBase): def test_iterkeys(self): # Get keys using iterkeys() - self._check_iteration(self._box.keys, do_keys=True, do_values=False) + self._check_iteration(self._box.iterkeys, do_keys=True, do_values=False) def test_keys(self): # Get keys using keys() @@ -308,7 +308,7 @@ class TestMailbox(TestBase): def test_itervalues(self): # Get values using itervalues() - self._check_iteration(self._box.values, do_keys=False, + self._check_iteration(self._box.itervalues, do_keys=False, do_values=True) def test_iter(self): @@ -322,7 +322,7 @@ class TestMailbox(TestBase): def test_iteritems(self): # Get keys and values using iteritems() - self._check_iteration(self._box.items, do_keys=True, + self._check_iteration(self._box.iteritems, do_keys=True, do_values=True) def test_items(self): @@ -564,12 +564,12 @@ class TestMailboxSuperclass(TestBase, unittest.TestCase): self.assertRaises(NotImplementedError, lambda: box.__delitem__('')) self.assertRaises(NotImplementedError, lambda: box.discard('')) self.assertRaises(NotImplementedError, lambda: box.__setitem__('', '')) + self.assertRaises(NotImplementedError, lambda: box.iterkeys()) self.assertRaises(NotImplementedError, lambda: box.keys()) - self.assertRaises(NotImplementedError, lambda: box.keys()) - self.assertRaises(NotImplementedError, lambda: box.values().__next__()) + self.assertRaises(NotImplementedError, lambda: box.itervalues().__next__()) self.assertRaises(NotImplementedError, lambda: box.__iter__().__next__()) self.assertRaises(NotImplementedError, lambda: box.values()) - self.assertRaises(NotImplementedError, lambda: box.items().next()) + self.assertRaises(NotImplementedError, lambda: box.iteritems().__next__()) self.assertRaises(NotImplementedError, lambda: box.items()) self.assertRaises(NotImplementedError, lambda: box.get('')) self.assertRaises(NotImplementedError, lambda: box.__getitem__('')) @@ -1020,7 +1020,7 @@ class _TestMboxMMDF(_TestSingleFile): mtime = os.path.getmtime(self._path) self._box = self._factory(self._path) self.assertEqual(len(self._box), 3) - for key in self._box.keys(): + for key in self._box.iterkeys(): self.assertIn(self._box.get_string(key), values) self._box.close() self.assertEqual(mtime, os.path.getmtime(self._path)) diff --git a/Misc/NEWS b/Misc/NEWS index 310a3b0b36e..18e5a6d1054 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Core and Builtins Library ------- +- Issue #20729: Restored the use of lazy iterkeys()/itervalues()/iteritems() + in the mailbox module. + - Issue #21448: Changed FeedParser feed() to avoid O(N**2) behavior when parsing long line. Original patch by Raymond Hettinger.