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']) >>> parser.parse_args(['--version'])
PROG 2.0 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 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 other object that implements the same interface. The recommended way to do
this is to extend :class:`Action`, overriding the ``__call__`` method 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, []) vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) 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 # Type classes
@ -1262,6 +1268,7 @@ class _ActionsContainer(object):
self.register('action', 'help', _HelpAction) self.register('action', 'help', _HelpAction)
self.register('action', 'version', _VersionAction) self.register('action', 'version', _VersionAction)
self.register('action', 'parsers', _SubParsersAction) self.register('action', 'parsers', _SubParsersAction)
self.register('action', 'extend', _ExtendAction)
# raise an exception if the conflict handler is invalid # raise an exception if the conflict handler is invalid
self._get_handler() 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]')) 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 # 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