Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions Lib/argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,10 @@ def _format_args(self, action, default_metavar):
elif action.nargs == SUPPRESS:
result = ''
else:
formats = ['%s' for _ in range(action.nargs)]
try:
formats = ['%s' for _ in range(action.nargs)]
except TypeError:
raise ValueError("invalid nargs value") from None
result = ' '.join(formats) % get_metavar(action.nargs)
return result

Expand Down Expand Up @@ -850,7 +853,7 @@ def __init__(self,
help=None,
metavar=None):
if nargs == 0:
raise ValueError('nargs for store actions must be > 0; if you '
raise ValueError('nargs for store actions must be != 0; if you '
'have nothing to store, actions such as store '
'true or store const may be more appropriate')
if const is not None and nargs != OPTIONAL:
Expand Down Expand Up @@ -942,7 +945,7 @@ def __init__(self,
help=None,
metavar=None):
if nargs == 0:
raise ValueError('nargs for append actions must be > 0; if arg '
raise ValueError('nargs for append actions must be != 0; if arg '
'strings are not supplying the value to append, '
'the append const action may be more appropriate')
if const is not None and nargs != OPTIONAL:
Expand Down
30 changes: 29 additions & 1 deletion Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -4263,7 +4263,6 @@ class TestHelpSubparsersWithHelpOrdering(HelpTestCase):


class TestHelpMetavarTypeFormatter(HelpTestCase):
""""""

def custom_type(string):
return string
Expand Down Expand Up @@ -5150,6 +5149,35 @@ def test_nargs_3_metavar_length2(self):
def test_nargs_3_metavar_length3(self):
self.do_test_no_exception(nargs=3, metavar=("1", "2", "3"))


class TestInvalidNargs(TestCase):

EXPECTED_INVALID_MESSAGE = "invalid nargs value"
EXPECTED_RANGE_MESSAGE = ("nargs for store actions must be != 0; if you "
"have nothing to store, actions such as store "
"true or store const may be more appropriate")

def do_test_range_exception(self, nargs):
parser = argparse.ArgumentParser()
with self.assertRaises(ValueError) as cm:
parser.add_argument("--foo", nargs=nargs)
self.assertEqual(cm.exception.args[0], self.EXPECTED_RANGE_MESSAGE)

def do_test_invalid_exception(self, nargs):
parser = argparse.ArgumentParser()
with self.assertRaises(ValueError) as cm:
parser.add_argument("--foo", nargs=nargs)
self.assertEqual(cm.exception.args[0], self.EXPECTED_INVALID_MESSAGE)

# Unit tests for different values of nargs

def test_nargs_alphabetic(self):
self.do_test_invalid_exception(nargs='a')
self.do_test_invalid_exception(nargs="abcd")

def test_nargs_zero(self):
self.do_test_range_exception(nargs=0)

# ============================
# from argparse import * tests
# ============================
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -1872,3 +1872,4 @@ Edison Abahurire
Geoff Shannon
Batuhan Taskaya
Aleksandr Balezin
Robert Leenders
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Adding a value error when an invalid value in passed to nargs
Patch by Robert Leenders