Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit edbe4c5

Browse files
committed
Issue #9348: Raise an early error if argparse nargs and metavar don't match. (Merge from 3.2.)
2 parents 0331e90 + 8d9a462 commit edbe4c5

3 files changed

Lines changed: 180 additions & 0 deletions

File tree

Lib/argparse.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,6 +1319,13 @@ def add_argument(self, *args, **kwargs):
13191319
if not _callable(type_func):
13201320
raise ValueError('%r is not callable' % type_func)
13211321

1322+
# raise an error if the metavar does not match the type
1323+
if hasattr(self, "_get_formatter"):
1324+
try:
1325+
self._get_formatter()._format_args(action, None)
1326+
except TypeError:
1327+
raise ValueError("length of metavar tuple does not match nargs")
1328+
13221329
return self._add_action(action)
13231330

13241331
def add_argument_group(self, *args, **kwargs):

Lib/test/test_argparse.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4425,6 +4425,177 @@ def test_mixed(self):
44254425
self.assertEqual(NS(v=3, spam=True, badger="B"), args)
44264426
self.assertEqual(["C", "--foo", "4"], extras)
44274427

4428+
# ==========================
4429+
# add_argument metavar tests
4430+
# ==========================
4431+
4432+
class TestAddArgumentMetavar(TestCase):
4433+
4434+
EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
4435+
4436+
def do_test_no_exception(self, nargs, metavar):
4437+
parser = argparse.ArgumentParser()
4438+
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4439+
4440+
def do_test_exception(self, nargs, metavar):
4441+
parser = argparse.ArgumentParser()
4442+
with self.assertRaises(ValueError) as cm:
4443+
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4444+
self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
4445+
4446+
# Unit tests for different values of metavar when nargs=None
4447+
4448+
def test_nargs_None_metavar_string(self):
4449+
self.do_test_no_exception(nargs=None, metavar="1")
4450+
4451+
def test_nargs_None_metavar_length0(self):
4452+
self.do_test_exception(nargs=None, metavar=tuple())
4453+
4454+
def test_nargs_None_metavar_length1(self):
4455+
self.do_test_no_exception(nargs=None, metavar=("1"))
4456+
4457+
def test_nargs_None_metavar_length2(self):
4458+
self.do_test_exception(nargs=None, metavar=("1", "2"))
4459+
4460+
def test_nargs_None_metavar_length3(self):
4461+
self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
4462+
4463+
# Unit tests for different values of metavar when nargs=?
4464+
4465+
def test_nargs_optional_metavar_string(self):
4466+
self.do_test_no_exception(nargs="?", metavar="1")
4467+
4468+
def test_nargs_optional_metavar_length0(self):
4469+
self.do_test_exception(nargs="?", metavar=tuple())
4470+
4471+
def test_nargs_optional_metavar_length1(self):
4472+
self.do_test_no_exception(nargs="?", metavar=("1"))
4473+
4474+
def test_nargs_optional_metavar_length2(self):
4475+
self.do_test_exception(nargs="?", metavar=("1", "2"))
4476+
4477+
def test_nargs_optional_metavar_length3(self):
4478+
self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
4479+
4480+
# Unit tests for different values of metavar when nargs=*
4481+
4482+
def test_nargs_zeroormore_metavar_string(self):
4483+
self.do_test_no_exception(nargs="*", metavar="1")
4484+
4485+
def test_nargs_zeroormore_metavar_length0(self):
4486+
self.do_test_exception(nargs="*", metavar=tuple())
4487+
4488+
def test_nargs_zeroormore_metavar_length1(self):
4489+
self.do_test_no_exception(nargs="*", metavar=("1"))
4490+
4491+
def test_nargs_zeroormore_metavar_length2(self):
4492+
self.do_test_no_exception(nargs="*", metavar=("1", "2"))
4493+
4494+
def test_nargs_zeroormore_metavar_length3(self):
4495+
self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
4496+
4497+
# Unit tests for different values of metavar when nargs=+
4498+
4499+
def test_nargs_oneormore_metavar_string(self):
4500+
self.do_test_no_exception(nargs="+", metavar="1")
4501+
4502+
def test_nargs_oneormore_metavar_length0(self):
4503+
self.do_test_exception(nargs="+", metavar=tuple())
4504+
4505+
def test_nargs_oneormore_metavar_length1(self):
4506+
self.do_test_no_exception(nargs="+", metavar=("1"))
4507+
4508+
def test_nargs_oneormore_metavar_length2(self):
4509+
self.do_test_no_exception(nargs="+", metavar=("1", "2"))
4510+
4511+
def test_nargs_oneormore_metavar_length3(self):
4512+
self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
4513+
4514+
# Unit tests for different values of metavar when nargs=...
4515+
4516+
def test_nargs_remainder_metavar_string(self):
4517+
self.do_test_no_exception(nargs="...", metavar="1")
4518+
4519+
def test_nargs_remainder_metavar_length0(self):
4520+
self.do_test_no_exception(nargs="...", metavar=tuple())
4521+
4522+
def test_nargs_remainder_metavar_length1(self):
4523+
self.do_test_no_exception(nargs="...", metavar=("1"))
4524+
4525+
def test_nargs_remainder_metavar_length2(self):
4526+
self.do_test_no_exception(nargs="...", metavar=("1", "2"))
4527+
4528+
def test_nargs_remainder_metavar_length3(self):
4529+
self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
4530+
4531+
# Unit tests for different values of metavar when nargs=A...
4532+
4533+
def test_nargs_parser_metavar_string(self):
4534+
self.do_test_no_exception(nargs="A...", metavar="1")
4535+
4536+
def test_nargs_parser_metavar_length0(self):
4537+
self.do_test_exception(nargs="A...", metavar=tuple())
4538+
4539+
def test_nargs_parser_metavar_length1(self):
4540+
self.do_test_no_exception(nargs="A...", metavar=("1"))
4541+
4542+
def test_nargs_parser_metavar_length2(self):
4543+
self.do_test_exception(nargs="A...", metavar=("1", "2"))
4544+
4545+
def test_nargs_parser_metavar_length3(self):
4546+
self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
4547+
4548+
# Unit tests for different values of metavar when nargs=1
4549+
4550+
def test_nargs_1_metavar_string(self):
4551+
self.do_test_no_exception(nargs=1, metavar="1")
4552+
4553+
def test_nargs_1_metavar_length0(self):
4554+
self.do_test_exception(nargs=1, metavar=tuple())
4555+
4556+
def test_nargs_1_metavar_length1(self):
4557+
self.do_test_no_exception(nargs=1, metavar=("1"))
4558+
4559+
def test_nargs_1_metavar_length2(self):
4560+
self.do_test_exception(nargs=1, metavar=("1", "2"))
4561+
4562+
def test_nargs_1_metavar_length3(self):
4563+
self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
4564+
4565+
# Unit tests for different values of metavar when nargs=2
4566+
4567+
def test_nargs_2_metavar_string(self):
4568+
self.do_test_no_exception(nargs=2, metavar="1")
4569+
4570+
def test_nargs_2_metavar_length0(self):
4571+
self.do_test_exception(nargs=2, metavar=tuple())
4572+
4573+
def test_nargs_2_metavar_length1(self):
4574+
self.do_test_no_exception(nargs=2, metavar=("1"))
4575+
4576+
def test_nargs_2_metavar_length2(self):
4577+
self.do_test_no_exception(nargs=2, metavar=("1", "2"))
4578+
4579+
def test_nargs_2_metavar_length3(self):
4580+
self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
4581+
4582+
# Unit tests for different values of metavar when nargs=3
4583+
4584+
def test_nargs_3_metavar_string(self):
4585+
self.do_test_no_exception(nargs=3, metavar="1")
4586+
4587+
def test_nargs_3_metavar_length0(self):
4588+
self.do_test_exception(nargs=3, metavar=tuple())
4589+
4590+
def test_nargs_3_metavar_length1(self):
4591+
self.do_test_no_exception(nargs=3, metavar=("1"))
4592+
4593+
def test_nargs_3_metavar_length2(self):
4594+
self.do_test_exception(nargs=3, metavar=("1", "2"))
4595+
4596+
def test_nargs_3_metavar_length3(self):
4597+
self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
4598+
44284599
# ============================
44294600
# from argparse import * tests
44304601
# ============================

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,6 +1530,8 @@ Library
15301530

15311531
- Issue #9948: Fixed problem of losing filename case information.
15321532

1533+
- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
1534+
15331535
Extension Modules
15341536
-----------------
15351537

0 commit comments

Comments
 (0)