Browse Source

bpo-23378: Add an extend action to argparse (GH-13305)

Add an extend action to argparse


https://bugs.python.org/issue23378
pull/13473/head
Batuhan Taşkaya 7 years ago
committed by Miss Islington (bot)
parent
commit
aa32a7e111
  1. 9
      Doc/library/argparse.rst
  2. 7
      Lib/argparse.py
  3. 9
      Lib/test/test_argparse.py
  4. 1
      Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst

9
Doc/library/argparse.rst

@ -797,6 +797,15 @@ how the command-line arguments should be handled. The supplied actions are:
>>> parser.parse_args(['--version'])
PROG 2.0
* ``'extend'`` - This stores a list, and extends each argument value to the
list.
Example usage::
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--foo", action="extend", nargs="+", type=str)
>>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"])
Namespace(foo=['f1', 'f2', 'f3', 'f4'])
You may also specify an arbitrary action by passing an Action subclass or
other object that implements the same interface. The recommended way to do
this is to extend :class:`Action`, overriding the ``__call__`` method

7
Lib/argparse.py

@ -1154,6 +1154,12 @@ class _SubParsersAction(Action):
vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
class _ExtendAction(_AppendAction):
def __call__(self, parser, namespace, values, option_string=None):
items = getattr(namespace, self.dest, None)
items = _copy_items(items)
items.extend(values)
setattr(namespace, self.dest, items)
# ==============
# Type classes
@ -1262,6 +1268,7 @@ class _ActionsContainer(object):
self.register('action', 'help', _HelpAction)
self.register('action', 'version', _VersionAction)
self.register('action', 'parsers', _SubParsersAction)
self.register('action', 'extend', _ExtendAction)
# raise an exception if the conflict handler is invalid
self._get_handler()

9
Lib/test/test_argparse.py

@ -1786,6 +1786,15 @@ class TestActionRegistration(TestCase):
self.assertEqual(parser.parse_args(['42']), NS(badger='foo[42]'))
class TestActionExtend(ParserTestCase):
argument_signatures = [
Sig('--foo', action="extend", nargs="+", type=str),
]
failures = ()
successes = [
('--foo f1 --foo f2 f3 f4', NS(foo=['f1', 'f2', 'f3', 'f4'])),
]
# ================
# Subparsers tests
# ================

1
Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst

@ -0,0 +1 @@
Add an extend action to argparser.
Loading…
Cancel
Save