[Python-checkins] cpython: Get rid of ugly code duplication for ElementTree.parse when the accelerator

eli.bendersky python-checkins at python.org
Mon May 20 03:47:33 CEST 2013


http://hg.python.org/cpython/rev/8425e8cc2bf2
changeset:   83852:8425e8cc2bf2
user:        Eli Bendersky <eliben at gmail.com>
date:        Sun May 19 18:47:23 2013 -0700
summary:
  Get rid of ugly code duplication for ElementTree.parse when the accelerator
is imported. Instead, ElementTree.parse can look for a special internal method
defined by the accelerator.

files:
  Lib/xml/etree/ElementTree.py |  39 ++++++-----------------
  Modules/_elementtree.c       |   7 +--
  2 files changed, 14 insertions(+), 32 deletions(-)


diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py
--- a/Lib/xml/etree/ElementTree.py
+++ b/Lib/xml/etree/ElementTree.py
@@ -587,9 +587,17 @@
             source = open(source, "rb")
             close_source = True
         try:
-            if not parser:
-                parser = XMLParser(target=TreeBuilder())
-            while 1:
+            if parser is None:
+                # If no parser was specified, create a default XMLParser
+                parser = XMLParser()
+                if hasattr(parser, '_parse_whole'):
+                    # The default XMLParser, when it comes from an accelerator,
+                    # can define an internal _parse_whole API for efficiency.
+                    # It can be used to parse the whole source without feeding
+                    # it with chunks.
+                    self._root = parser._parse_whole(source)
+                    return self._root
+            while True:
                 data = source.read(65536)
                 if not data:
                     break
@@ -1651,30 +1659,5 @@
 
     # Element, SubElement, ParseError, TreeBuilder, XMLParser
     from _elementtree import *
-
-    # Overwrite 'ElementTree.parse' to use the C XMLParser
-    class ElementTree(ElementTree):
-        __doc__ = ElementTree.__doc__
-        def parse(self, source, parser=None):
-            __doc__ = ElementTree.parse.__doc__
-            close_source = False
-            if not hasattr(source, 'read'):
-                source = open(source, 'rb')
-                close_source = True
-            try:
-                if parser is not None:
-                    while True:
-                        data = source.read(65536)
-                        if not data:
-                            break
-                        parser.feed(data)
-                    self._root = parser.close()
-                else:
-                    parser = XMLParser()
-                    self._root = parser._parse(source)
-                return self._root
-            finally:
-                if close_source:
-                    source.close()
 except ImportError:
     pass
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -3347,10 +3347,9 @@
 }
 
 static PyObject*
-xmlparser_parse(XMLParserObject* self, PyObject* args)
+xmlparser_parse_whole(XMLParserObject* self, PyObject* args)
 {
-    /* (internal) parse until end of input stream */
-
+    /* (internal) parse the whole input, until end of stream */
     PyObject* reader;
     PyObject* buffer;
     PyObject* temp;
@@ -3526,7 +3525,7 @@
 static PyMethodDef xmlparser_methods[] = {
     {"feed", (PyCFunction) xmlparser_feed, METH_VARARGS},
     {"close", (PyCFunction) xmlparser_close, METH_VARARGS},
-    {"_parse", (PyCFunction) xmlparser_parse, METH_VARARGS},
+    {"_parse_whole", (PyCFunction) xmlparser_parse_whole, METH_VARARGS},
     {"_setevents", (PyCFunction) xmlparser_setevents, METH_VARARGS},
     {"doctype", (PyCFunction) xmlparser_doctype, METH_VARARGS},
     {NULL, NULL}

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list