diff --git a/Lib/email/feedparser.py b/Lib/email/feedparser.py --- a/Lib/email/feedparser.py +++ b/Lib/email/feedparser.py @@ -23,6 +23,7 @@ import re +from collections import deque from email import errors from email import message from email._policybase import compat32 @@ -52,8 +53,8 @@ def __init__(self): # The last partial line pushed into this object. self._partial = '' - # The list of full, pushed lines, in reverse order - self._lines = [] + # A deque of full, pushed lines + self._lines = deque() # The stack of false-EOF checking predicates. self._eofstack = [] # A flag indicating whether the file has been closed or not. @@ -67,7 +68,7 @@ def close(self): # Don't forget any trailing partial line. - self._lines.append(self._partial) + self._lines.appendleft(self._partial) self._partial = '' self._closed = True @@ -78,21 +79,21 @@ return NeedMoreData # Pop the line off the stack and see if it matches the current # false-EOF predicate. - line = self._lines.pop() + line = self._lines.popleft() # RFC 2046, section 5.1.2 requires us to recognize outer level # boundaries at any level of inner nesting. Do this, but be sure it's # in the order of most to least nested. - for ateof in self._eofstack[::-1]: + for ateof in reversed(self._eofstack): if ateof(line): # We're at the false EOF. But push the last line back first. - self._lines.append(line) + self._lines.appendleft(line) return '' return line def unreadline(self, line): # Let the consumer push a line back into the buffer. assert line is not NeedMoreData - self._lines.append(line) + self._lines.appendleft(line) def push(self, data): """Push some new data into this object.""" @@ -110,7 +111,7 @@ def pushlines(self, lines): # Reverse and insert at the front of the lines. - self._lines[:0] = lines[::-1] + self._lines.extend(lines) def __iter__(self): return self