mirror of
https://github.com/python/cpython.git
synced 2025-11-02 03:01:58 +00:00
Merge 3.2: issue #2892
This commit is contained in:
commit
f24e7e6c41
4 changed files with 53 additions and 34 deletions
|
|
@ -754,6 +754,7 @@ def iterparse():
|
||||||
... print(action, elem.tag)
|
... print(action, elem.tag)
|
||||||
... except ET.ParseError as v:
|
... except ET.ParseError as v:
|
||||||
... print(v)
|
... print(v)
|
||||||
|
end document
|
||||||
junk after document element: line 1, column 12
|
junk after document element: line 1, column 12
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1250,6 +1250,7 @@ class _IterParseIterator:
|
||||||
self._close_file = close_source
|
self._close_file = close_source
|
||||||
self._events = []
|
self._events = []
|
||||||
self._index = 0
|
self._index = 0
|
||||||
|
self._error = None
|
||||||
self.root = self._root = None
|
self.root = self._root = None
|
||||||
self._parser = parser
|
self._parser = parser
|
||||||
# wire up the parser for event reporting
|
# wire up the parser for event reporting
|
||||||
|
|
@ -1291,24 +1292,31 @@ class _IterParseIterator:
|
||||||
while 1:
|
while 1:
|
||||||
try:
|
try:
|
||||||
item = self._events[self._index]
|
item = self._events[self._index]
|
||||||
except IndexError:
|
self._index += 1
|
||||||
if self._parser is None:
|
|
||||||
self.root = self._root
|
|
||||||
if self._close_file:
|
|
||||||
self._file.close()
|
|
||||||
raise StopIteration
|
|
||||||
# load event buffer
|
|
||||||
del self._events[:]
|
|
||||||
self._index = 0
|
|
||||||
data = self._file.read(16384)
|
|
||||||
if data:
|
|
||||||
self._parser.feed(data)
|
|
||||||
else:
|
|
||||||
self._root = self._parser.close()
|
|
||||||
self._parser = None
|
|
||||||
else:
|
|
||||||
self._index = self._index + 1
|
|
||||||
return item
|
return item
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
if self._error:
|
||||||
|
e = self._error
|
||||||
|
self._error = None
|
||||||
|
raise e
|
||||||
|
if self._parser is None:
|
||||||
|
self.root = self._root
|
||||||
|
if self._close_file:
|
||||||
|
self._file.close()
|
||||||
|
raise StopIteration
|
||||||
|
# load event buffer
|
||||||
|
del self._events[:]
|
||||||
|
self._index = 0
|
||||||
|
data = self._file.read(16384)
|
||||||
|
if data:
|
||||||
|
try:
|
||||||
|
self._parser.feed(data)
|
||||||
|
except SyntaxError as exc:
|
||||||
|
self._error = exc
|
||||||
|
else:
|
||||||
|
self._root = self._parser.close()
|
||||||
|
self._parser = None
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return self
|
return self
|
||||||
|
|
|
||||||
|
|
@ -350,6 +350,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #2892: preserve iterparse events in case of SyntaxError.
|
||||||
|
|
||||||
- Issue #13287: urllib.request and urllib.error now contains a __all__ and
|
- Issue #13287: urllib.request and urllib.error now contains a __all__ and
|
||||||
exposes only relevant Classes, Functions. Patch by Florent Xicluna.
|
exposes only relevant Classes, Functions. Patch by Florent Xicluna.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3016,6 +3016,7 @@ PyInit__elementtree(void)
|
||||||
" self._file = file\n"
|
" self._file = file\n"
|
||||||
" self._events = []\n"
|
" self._events = []\n"
|
||||||
" self._index = 0\n"
|
" self._index = 0\n"
|
||||||
|
" self._error = None\n"
|
||||||
" self.root = self._root = None\n"
|
" self.root = self._root = None\n"
|
||||||
" b = cElementTree.TreeBuilder()\n"
|
" b = cElementTree.TreeBuilder()\n"
|
||||||
" self._parser = cElementTree.XMLParser(b)\n"
|
" self._parser = cElementTree.XMLParser(b)\n"
|
||||||
|
|
@ -3024,24 +3025,31 @@ PyInit__elementtree(void)
|
||||||
" while 1:\n"
|
" while 1:\n"
|
||||||
" try:\n"
|
" try:\n"
|
||||||
" item = self._events[self._index]\n"
|
" item = self._events[self._index]\n"
|
||||||
" except IndexError:\n"
|
" self._index += 1\n"
|
||||||
" if self._parser is None:\n"
|
|
||||||
" self.root = self._root\n"
|
|
||||||
" if self._close_file:\n"
|
|
||||||
" self._file.close()\n"
|
|
||||||
" raise StopIteration\n"
|
|
||||||
" # load event buffer\n"
|
|
||||||
" del self._events[:]\n"
|
|
||||||
" self._index = 0\n"
|
|
||||||
" data = self._file.read(16384)\n"
|
|
||||||
" if data:\n"
|
|
||||||
" self._parser.feed(data)\n"
|
|
||||||
" else:\n"
|
|
||||||
" self._root = self._parser.close()\n"
|
|
||||||
" self._parser = None\n"
|
|
||||||
" else:\n"
|
|
||||||
" self._index = self._index + 1\n"
|
|
||||||
" return item\n"
|
" return item\n"
|
||||||
|
" except IndexError:\n"
|
||||||
|
" pass\n"
|
||||||
|
" if self._error:\n"
|
||||||
|
" e = self._error\n"
|
||||||
|
" self._error = None\n"
|
||||||
|
" raise e\n"
|
||||||
|
" if self._parser is None:\n"
|
||||||
|
" self.root = self._root\n"
|
||||||
|
" if self._close_file:\n"
|
||||||
|
" self._file.close()\n"
|
||||||
|
" raise StopIteration\n"
|
||||||
|
" # load event buffer\n"
|
||||||
|
" del self._events[:]\n"
|
||||||
|
" self._index = 0\n"
|
||||||
|
" data = self._file.read(16384)\n"
|
||||||
|
" if data:\n"
|
||||||
|
" try:\n"
|
||||||
|
" self._parser.feed(data)\n"
|
||||||
|
" except SyntaxError as exc:\n"
|
||||||
|
" self._error = exc\n"
|
||||||
|
" else:\n"
|
||||||
|
" self._root = self._parser.close()\n"
|
||||||
|
" self._parser = None\n"
|
||||||
" def __iter__(self):\n"
|
" def __iter__(self):\n"
|
||||||
" return self\n"
|
" return self\n"
|
||||||
"cElementTree.iterparse = iterparse\n"
|
"cElementTree.iterparse = iterparse\n"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue