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

Skip to content

Commit 8d9a462

Browse files
committed
Issue #9348: Raise an early error if argparse nargs and metavar don't match.
1 parent 633872e commit 8d9a462

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
@@ -1294,6 +1294,13 @@ def add_argument(self, *args, **kwargs):
12941294
if not _callable(type_func):
12951295
raise ValueError('%r is not callable' % type_func)
12961296

1297+
# raise an error if the metavar does not match the type
1298+
if hasattr(self, "_get_formatter"):
1299+
try:
1300+
self._get_formatter()._format_args(action, None)
1301+
except TypeError:
1302+
raise ValueError("length of metavar tuple does not match nargs")
1303+
12971304
return self._add_action(action)
12981305

12991306
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
@@ -4394,6 +4394,177 @@ def test_mixed(self):
43944394
self.assertEqual(NS(v=3, spam=True, badger="B"), args)
43954395
self.assertEqual(["C", "--foo", "4"], extras)
43964396

4397+
# ==========================
4398+
# add_argument metavar tests
4399+
# ==========================
4400+
4401+
class TestAddArgumentMetavar(TestCase):
4402+
4403+
EXPECTED_MESSAGE = "length of metavar tuple does not match nargs"
4404+
4405+
def do_test_no_exception(self, nargs, metavar):
4406+
parser = argparse.ArgumentParser()
4407+
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4408+
4409+
def do_test_exception(self, nargs, metavar):
4410+
parser = argparse.ArgumentParser()
4411+
with self.assertRaises(ValueError) as cm:
4412+
parser.add_argument("--foo", nargs=nargs, metavar=metavar)
4413+
self.assertEqual(cm.exception.args[0], self.EXPECTED_MESSAGE)
4414+
4415+
# Unit tests for different values of metavar when nargs=None
4416+
4417+
def test_nargs_None_metavar_string(self):
4418+
self.do_test_no_exception(nargs=None, metavar="1")
4419+
4420+
def test_nargs_None_metavar_length0(self):
4421+
self.do_test_exception(nargs=None, metavar=tuple())
4422+
4423+
def test_nargs_None_metavar_length1(self):
4424+
self.do_test_no_exception(nargs=None, metavar=("1"))
4425+
4426+
def test_nargs_None_metavar_length2(self):
4427+
self.do_test_exception(nargs=None, metavar=("1", "2"))
4428+
4429+
def test_nargs_None_metavar_length3(self):
4430+
self.do_test_exception(nargs=None, metavar=("1", "2", "3"))
4431+
4432+
# Unit tests for different values of metavar when nargs=?
4433+
4434+
def test_nargs_optional_metavar_string(self):
4435+
self.do_test_no_exception(nargs="?", metavar="1")
4436+
4437+
def test_nargs_optional_metavar_length0(self):
4438+
self.do_test_exception(nargs="?", metavar=tuple())
4439+
4440+
def test_nargs_optional_metavar_length1(self):
4441+
self.do_test_no_exception(nargs="?", metavar=("1"))
4442+
4443+
def test_nargs_optional_metavar_length2(self):
4444+
self.do_test_exception(nargs="?", metavar=("1", "2"))
4445+
4446+
def test_nargs_optional_metavar_length3(self):
4447+
self.do_test_exception(nargs="?", metavar=("1", "2", "3"))
4448+
4449+
# Unit tests for different values of metavar when nargs=*
4450+
4451+
def test_nargs_zeroormore_metavar_string(self):
4452+
self.do_test_no_exception(nargs="*", metavar="1")
4453+
4454+
def test_nargs_zeroormore_metavar_length0(self):
4455+
self.do_test_exception(nargs="*", metavar=tuple())
4456+
4457+
def test_nargs_zeroormore_metavar_length1(self):
4458+
self.do_test_no_exception(nargs="*", metavar=("1"))
4459+
4460+
def test_nargs_zeroormore_metavar_length2(self):
4461+
self.do_test_no_exception(nargs="*", metavar=("1", "2"))
4462+
4463+
def test_nargs_zeroormore_metavar_length3(self):
4464+
self.do_test_exception(nargs="*", metavar=("1", "2", "3"))
4465+
4466+
# Unit tests for different values of metavar when nargs=+
4467+
4468+
def test_nargs_oneormore_metavar_string(self):
4469+
self.do_test_no_exception(nargs="+", metavar="1")
4470+
4471+
def test_nargs_oneormore_metavar_length0(self):
4472+
self.do_test_exception(nargs="+", metavar=tuple())
4473+
4474+
def test_nargs_oneormore_metavar_length1(self):
4475+
self.do_test_no_exception(nargs="+", metavar=("1"))
4476+
4477+
def test_nargs_oneormore_metavar_length2(self):
4478+
self.do_test_no_exception(nargs="+", metavar=("1", "2"))
4479+
4480+
def test_nargs_oneormore_metavar_length3(self):
4481+
self.do_test_exception(nargs="+", metavar=("1", "2", "3"))
4482+
4483+
# Unit tests for different values of metavar when nargs=...
4484+
4485+
def test_nargs_remainder_metavar_string(self):
4486+
self.do_test_no_exception(nargs="...", metavar="1")
4487+
4488+
def test_nargs_remainder_metavar_length0(self):
4489+
self.do_test_no_exception(nargs="...", metavar=tuple())
4490+
4491+
def test_nargs_remainder_metavar_length1(self):
4492+
self.do_test_no_exception(nargs="...", metavar=("1"))
4493+
4494+
def test_nargs_remainder_metavar_length2(self):
4495+
self.do_test_no_exception(nargs="...", metavar=("1", "2"))
4496+
4497+
def test_nargs_remainder_metavar_length3(self):
4498+
self.do_test_no_exception(nargs="...", metavar=("1", "2", "3"))
4499+
4500+
# Unit tests for different values of metavar when nargs=A...
4501+
4502+
def test_nargs_parser_metavar_string(self):
4503+
self.do_test_no_exception(nargs="A...", metavar="1")
4504+
4505+
def test_nargs_parser_metavar_length0(self):
4506+
self.do_test_exception(nargs="A...", metavar=tuple())
4507+
4508+
def test_nargs_parser_metavar_length1(self):
4509+
self.do_test_no_exception(nargs="A...", metavar=("1"))
4510+
4511+
def test_nargs_parser_metavar_length2(self):
4512+
self.do_test_exception(nargs="A...", metavar=("1", "2"))
4513+
4514+
def test_nargs_parser_metavar_length3(self):
4515+
self.do_test_exception(nargs="A...", metavar=("1", "2", "3"))
4516+
4517+
# Unit tests for different values of metavar when nargs=1
4518+
4519+
def test_nargs_1_metavar_string(self):
4520+
self.do_test_no_exception(nargs=1, metavar="1")
4521+
4522+
def test_nargs_1_metavar_length0(self):
4523+
self.do_test_exception(nargs=1, metavar=tuple())
4524+
4525+
def test_nargs_1_metavar_length1(self):
4526+
self.do_test_no_exception(nargs=1, metavar=("1"))
4527+
4528+
def test_nargs_1_metavar_length2(self):
4529+
self.do_test_exception(nargs=1, metavar=("1", "2"))
4530+
4531+
def test_nargs_1_metavar_length3(self):
4532+
self.do_test_exception(nargs=1, metavar=("1", "2", "3"))
4533+
4534+
# Unit tests for different values of metavar when nargs=2
4535+
4536+
def test_nargs_2_metavar_string(self):
4537+
self.do_test_no_exception(nargs=2, metavar="1")
4538+
4539+
def test_nargs_2_metavar_length0(self):
4540+
self.do_test_exception(nargs=2, metavar=tuple())
4541+
4542+
def test_nargs_2_metavar_length1(self):
4543+
self.do_test_no_exception(nargs=2, metavar=("1"))
4544+
4545+
def test_nargs_2_metavar_length2(self):
4546+
self.do_test_no_exception(nargs=2, metavar=("1", "2"))
4547+
4548+
def test_nargs_2_metavar_length3(self):
4549+
self.do_test_exception(nargs=2, metavar=("1", "2", "3"))
4550+
4551+
# Unit tests for different values of metavar when nargs=3
4552+
4553+
def test_nargs_3_metavar_string(self):
4554+
self.do_test_no_exception(nargs=3, metavar="1")
4555+
4556+
def test_nargs_3_metavar_length0(self):
4557+
self.do_test_exception(nargs=3, metavar=tuple())
4558+
4559+
def test_nargs_3_metavar_length1(self):
4560+
self.do_test_no_exception(nargs=3, metavar=("1"))
4561+
4562+
def test_nargs_3_metavar_length2(self):
4563+
self.do_test_exception(nargs=3, metavar=("1", "2"))
4564+
4565+
def test_nargs_3_metavar_length3(self):
4566+
self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))
4567+
43974568
# ============================
43984569
# from argparse import * tests
43994570
# ============================

Misc/NEWS

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

13651365
- Issue #9948: Fixed problem of losing filename case information.
13661366

1367+
- Issue #9348: Raise an early error if argparse nargs and metavar don't match.
1368+
13671369
Extension Modules
13681370
-----------------
13691371

0 commit comments

Comments
 (0)