]> granicus.if.org Git - python/commitdiff
bpo-23378: Add an extend action to argparse (GH-13305)
authorBatuhan Taşkaya <47358913+isidentical@users.noreply.github.com>
Tue, 21 May 2019 17:47:42 +0000 (20:47 +0300)
committerMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 21 May 2019 17:47:42 +0000 (10:47 -0700)
Add an extend action to argparse

https://bugs.python.org/issue23378

Doc/library/argparse.rst
Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst [new file with mode: 0644]

index cef197f30555818d539db7b3d587251f640bf4ac..b77a38ccd485776b720d77d858aa5ae70b3db2f7 100644 (file)
@@ -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
index 798766f6c4086a14d16652a3a01c4b17897c181f..ef888f063b328641e45d586c35284df9b8532505 100644 (file)
@@ -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()
index e849c7ba49bcd26fa70594b8fa085749e81db198..9d68f40571fe6f6bde9a88f61b58b2c9388ab576 100644 (file)
@@ -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
 # ================
diff --git a/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst b/Misc/NEWS.d/next/Library/2019-05-14-05-38-22.bpo-23378.R25teI.rst
new file mode 100644 (file)
index 0000000..c7c3f17
--- /dev/null
@@ -0,0 +1 @@
+Add an extend action to argparser.