mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +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)
 | 
			
		||||
    ... except ET.ParseError as v:
 | 
			
		||||
    ...   print(v)
 | 
			
		||||
    end document
 | 
			
		||||
    junk after document element: line 1, column 12
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1250,6 +1250,7 @@ class _IterParseIterator:
 | 
			
		|||
        self._close_file = close_source
 | 
			
		||||
        self._events = []
 | 
			
		||||
        self._index = 0
 | 
			
		||||
        self._error = None
 | 
			
		||||
        self.root = self._root = None
 | 
			
		||||
        self._parser = parser
 | 
			
		||||
        # wire up the parser for event reporting
 | 
			
		||||
| 
						 | 
				
			
			@ -1291,7 +1292,14 @@ class _IterParseIterator:
 | 
			
		|||
        while 1:
 | 
			
		||||
            try:
 | 
			
		||||
                item = self._events[self._index]
 | 
			
		||||
                self._index += 1
 | 
			
		||||
                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:
 | 
			
		||||
| 
						 | 
				
			
			@ -1302,13 +1310,13 @@ class _IterParseIterator:
 | 
			
		|||
            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
 | 
			
		||||
            else:
 | 
			
		||||
                self._index = self._index + 1
 | 
			
		||||
                return item
 | 
			
		||||
 | 
			
		||||
    def __iter__(self):
 | 
			
		||||
        return self
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -350,6 +350,8 @@ Core and Builtins
 | 
			
		|||
Library
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
- Issue #2892: preserve iterparse events in case of SyntaxError.
 | 
			
		||||
 | 
			
		||||
- Issue #13287: urllib.request and urllib.error now contains a __all__ and
 | 
			
		||||
  exposes only relevant Classes, Functions. Patch by Florent Xicluna.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3016,6 +3016,7 @@ PyInit__elementtree(void)
 | 
			
		|||
        "  self._file = file\n"
 | 
			
		||||
        "  self._events = []\n"
 | 
			
		||||
        "  self._index = 0\n"
 | 
			
		||||
        "  self._error = None\n"
 | 
			
		||||
        "  self.root = self._root = None\n"
 | 
			
		||||
        "  b = cElementTree.TreeBuilder()\n"
 | 
			
		||||
        "  self._parser = cElementTree.XMLParser(b)\n"
 | 
			
		||||
| 
						 | 
				
			
			@ -3024,7 +3025,14 @@ PyInit__elementtree(void)
 | 
			
		|||
        "  while 1:\n"
 | 
			
		||||
        "    try:\n"
 | 
			
		||||
        "      item = self._events[self._index]\n"
 | 
			
		||||
        "      self._index += 1\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"
 | 
			
		||||
| 
						 | 
				
			
			@ -3035,13 +3043,13 @@ PyInit__elementtree(void)
 | 
			
		|||
        "    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"
 | 
			
		||||
        "    else:\n"
 | 
			
		||||
        "      self._index = self._index + 1\n"
 | 
			
		||||
        "      return item\n"
 | 
			
		||||
        " def __iter__(self):\n"
 | 
			
		||||
        "  return self\n"
 | 
			
		||||
        "cElementTree.iterparse = iterparse\n"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue