Kaydet (Commit) a6dc5310 authored tarafından Andrés Delfino's avatar Andrés Delfino Kaydeden (comit) Tal Einat

bpo-34789: make xml.sax.make_parser accept iterables of all types (GH-9576)

üst 10cb3760
...@@ -40,10 +40,13 @@ The convenience functions are: ...@@ -40,10 +40,13 @@ The convenience functions are:
Create and return a SAX :class:`~xml.sax.xmlreader.XMLReader` object. The Create and return a SAX :class:`~xml.sax.xmlreader.XMLReader` object. The
first parser found will 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 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. 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()) .. function:: parse(filename_or_stream, handler, error_handler=handler.ErrorHandler())
......
...@@ -254,6 +254,34 @@ class MakeParserTest(unittest.TestCase): ...@@ -254,6 +254,34 @@ class MakeParserTest(unittest.TestCase):
from xml.sax import make_parser from xml.sax import make_parser
p = 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']))
# =========================================================================== # ===========================================================================
# #
......
...@@ -67,15 +67,15 @@ if sys.platform[:4] == "java" and sys.registry.containsKey(_key): ...@@ -67,15 +67,15 @@ if sys.platform[:4] == "java" and sys.registry.containsKey(_key):
default_parser_list = sys.registry.getProperty(_key).split(",") 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 and returns a SAX parser.
Creates the first parser it is able to instantiate of the ones Creates the first parser it is able to instantiate of the ones
given in the list created by doing parser_list + given in the iterable created by chaining parser_list and
default_parser_list. The lists must contain the names of Python default_parser_list. The iterables must contain the names of Python
modules containing both a SAX parser and a create_parser function.""" 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: try:
return _create_parser(parser_name) return _create_parser(parser_name)
except ImportError as e: except ImportError as e:
......
:func:`xml.sax.make_parser` now accepts any iterable as its *parser_list*
argument. Patch by Andrés Delfino.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment