Skip to content

Commit

Permalink
bpo-34789: make xml.sax.make_parser accept iterables of all types (GH…
Browse files Browse the repository at this point in the history
  • Loading branch information
andresdelfino authored and taleinat committed Oct 26, 2018
1 parent 10cb376 commit a6dc531
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 5 deletions.
5 changes: 4 additions & 1 deletion Doc/library/xml.sax.rst
Expand Up @@ -40,10 +40,13 @@ The convenience functions are:

Create and return a SAX :class:`~xml.sax.xmlreader.XMLReader` object. The
first parser found will
be used. If *parser_list* is provided, it must be a sequence of strings which
be used. If *parser_list* is provided, it must be an iterable of strings which
name modules that have a function named :func:`create_parser`. Modules listed
in *parser_list* will be used before modules in the default list of parsers.

.. versionchanged:: 3.8
The *parser_list* argument can be any iterable, not just a list.


.. function:: parse(filename_or_stream, handler, error_handler=handler.ErrorHandler())

Expand Down
28 changes: 28 additions & 0 deletions Lib/test/test_sax.py
Expand Up @@ -254,6 +254,34 @@ def test_make_parser2(self):
from xml.sax import make_parser
p = make_parser()

def test_make_parser3(self):
# Testing that make_parser can handle different types of
# iterables.
make_parser(['module'])
make_parser(('module', ))
make_parser({'module'})
make_parser(frozenset({'module'}))
make_parser({'module': None})
make_parser(iter(['module']))

def test_make_parser4(self):
# Testing that make_parser can handle empty iterables.
make_parser([])
make_parser(tuple())
make_parser(set())
make_parser(frozenset())
make_parser({})
make_parser(iter([]))

def test_make_parser5(self):
# Testing that make_parser can handle iterables with more than
# one item.
make_parser(['module1', 'module2'])
make_parser(('module1', 'module2'))
make_parser({'module1', 'module2'})
make_parser(frozenset({'module1', 'module2'}))
make_parser({'module1': None, 'module2': None})
make_parser(iter(['module1', 'module2']))

# ===========================================================================
#
Expand Down
8 changes: 4 additions & 4 deletions Lib/xml/sax/__init__.py
Expand Up @@ -67,15 +67,15 @@ def parseString(string, handler, errorHandler=ErrorHandler()):
default_parser_list = sys.registry.getProperty(_key).split(",")


def make_parser(parser_list = []):
def make_parser(parser_list=()):
"""Creates and returns a SAX parser.
Creates the first parser it is able to instantiate of the ones
given in the list created by doing parser_list +
default_parser_list. The lists must contain the names of Python
given in the iterable created by chaining parser_list and
default_parser_list. The iterables must contain the names of Python
modules containing both a SAX parser and a create_parser function."""

for parser_name in parser_list + default_parser_list:
for parser_name in list(parser_list) + default_parser_list:
try:
return _create_parser(parser_name)
except ImportError as e:
Expand Down
@@ -0,0 +1,2 @@
:func:`xml.sax.make_parser` now accepts any iterable as its *parser_list*
argument. Patch by Andrés Delfino.

0 comments on commit a6dc531

Please sign in to comment.