mirror of https://github.com/python/cpython
bpo-34789: make xml.sax.make_parser accept iterables of all types (GH-9576)
This commit is contained in:
parent
10cb3760e8
commit
a6dc531063
|
@ -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())
|
||||
|
||||
|
|
|
@ -254,6 +254,34 @@ class MakeParserTest(unittest.TestCase):
|
|||
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']))
|
||||
|
||||
# ===========================================================================
|
||||
#
|
||||
|
|
|
@ -67,15 +67,15 @@ if sys.platform[:4] == "java" and sys.registry.containsKey(_key):
|
|||
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:
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
:func:`xml.sax.make_parser` now accepts any iterable as its *parser_list*
|
||||
argument. Patch by Andrés Delfino.
|
Loading…
Reference in New Issue