Issue #9348: Raise an early error if argparse nargs and metavar don't match. (Merge from 3.2.)
This commit is contained in:
commit
edbe4c5249
|
@ -1319,6 +1319,13 @@ class _ActionsContainer(object):
|
||||||
if not _callable(type_func):
|
if not _callable(type_func):
|
||||||
raise ValueError('%r is not callable' % type_func)
|
raise ValueError('%r is not callable' % type_func)
|
||||||
|
|
||||||
|
# raise an error if the metavar does not match the type
|
||||||
|
if hasattr(self, "_get_formatter"):
|
||||||
|
try:
|
||||||
|
self._get_formatter()._format_args(action, None)
|
||||||
|
except TypeError:
|
||||||
|
raise ValueError("length of metavar tuple does not match nargs")
|
||||||
|
|
||||||
return self._add_action(action)
|
return self._add_action(action)
|
||||||
|
|
||||||
def add_argument_group(self, *args, **kwargs):
|
def add_argument_group(self, *args, **kwargs):
|
||||||
|
|
|
@ -4425,6 +4425,177 @@ class TestParseKnownArgs(TestCase):
|
||||||
self.assertEqual(NS(v=3, spam=True, badger="B"), args)
|
self.assertEqual(NS(v=3, spam=True, badger="B"), args)
|
||||||
self.assertEqual(["C", "--foo", "4"], extras)
|
self.assertEqual(["C", "--foo", "4"], extras)
|
||||||
|
|
||||||
|
# ==========================
|
||||||
|
# add_argument metavar tests
|
||||||
|
# ==========================
|
||||||
|
|
||||||
|
class TestAddArgumentMetavar(TestCase):
|
||||||
|
|
||||||
|
EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
|
||||||
|
|
||||||
|
def do_test_no_exception(self, nargs, metavar):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
|
||||||
|
|
||||||
|
def do_test_exception(self, nargs, metavar):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
with self.assertRaises(ValueError) as cm:
|
||||||
|
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
|
||||||
|
self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=None
|
||||||
|
|
||||||
|
def test_nargs_None_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs=None, metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_None_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs=None, metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_None_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs=None, metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_None_metavar_length2(self):
|
||||||
|
self.do_test_exception(nargs=None, metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_None_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=?
|
||||||
|
|
||||||
|
def test_nargs_optional_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs="?", metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_optional_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs="?", metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_optional_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs="?", metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_optional_metavar_length2(self):
|
||||||
|
self.do_test_exception(nargs="?", metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_optional_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=*
|
||||||
|
|
||||||
|
def test_nargs_zeroormore_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs="*", metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_zeroormore_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs="*", metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_zeroormore_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs="*", metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_zeroormore_metavar_length2(self):
|
||||||
|
self.do_test_no_exception(nargs="*", metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_zeroormore_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=+
|
||||||
|
|
||||||
|
def test_nargs_oneormore_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs="+", metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_oneormore_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs="+", metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_oneormore_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs="+", metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_oneormore_metavar_length2(self):
|
||||||
|
self.do_test_no_exception(nargs="+", metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_oneormore_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=...
|
||||||
|
|
||||||
|
def test_nargs_remainder_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs="...", metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_remainder_metavar_length0(self):
|
||||||
|
self.do_test_no_exception(nargs="...", metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_remainder_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs="...", metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_remainder_metavar_length2(self):
|
||||||
|
self.do_test_no_exception(nargs="...", metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_remainder_metavar_length3(self):
|
||||||
|
self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=A...
|
||||||
|
|
||||||
|
def test_nargs_parser_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs="A...", metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_parser_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs="A...", metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_parser_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs="A...", metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_parser_metavar_length2(self):
|
||||||
|
self.do_test_exception(nargs="A...", metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_parser_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=1
|
||||||
|
|
||||||
|
def test_nargs_1_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs=1, metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_1_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs=1, metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_1_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs=1, metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_1_metavar_length2(self):
|
||||||
|
self.do_test_exception(nargs=1, metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_1_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=2
|
||||||
|
|
||||||
|
def test_nargs_2_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs=2, metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_2_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs=2, metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_2_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs=2, metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_2_metavar_length2(self):
|
||||||
|
self.do_test_no_exception(nargs=2, metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_2_metavar_length3(self):
|
||||||
|
self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
|
||||||
|
|
||||||
|
# Unit tests for different values of metavar when nargs=3
|
||||||
|
|
||||||
|
def test_nargs_3_metavar_string(self):
|
||||||
|
self.do_test_no_exception(nargs=3, metavar="1")
|
||||||
|
|
||||||
|
def test_nargs_3_metavar_length0(self):
|
||||||
|
self.do_test_exception(nargs=3, metavar=tuple())
|
||||||
|
|
||||||
|
def test_nargs_3_metavar_length1(self):
|
||||||
|
self.do_test_no_exception(nargs=3, metavar=("1"))
|
||||||
|
|
||||||
|
def test_nargs_3_metavar_length2(self):
|
||||||
|
self.do_test_exception(nargs=3, metavar=("1", "2"))
|
||||||
|
|
||||||
|
def test_nargs_3_metavar_length3(self):
|
||||||
|
self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
|
||||||
|
|
||||||
# ============================
|
# ============================
|
||||||
# from argparse import * tests
|
# from argparse import * tests
|
||||||
# ============================
|
# ============================
|
||||||
|
|
|
@ -1530,6 +1530,8 @@ Library
|
||||||
|
|
||||||
- Issue #9948: Fixed problem of losing filename case information.
|
- Issue #9948: Fixed problem of losing filename case information.
|
||||||
|
|
||||||
|
- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
|
||||||
|
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue