Issue 27227: argparse fails to parse [] when using choices and nargs='*' (original) (raw)
When using nargs='*' with choices, it is impossible to specify 0 args:
from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument('foo', choices=['foo'], nargs='*') args = parser.parse_args([]) # <-- fails, error message below assert args.foo == []
usage: args.py [-h] [{foo} [{foo} ...]]
args.py: error: argument foo: invalid choice: [] (choose from 'foo')
The problem appears to be this block of code trying to validate value
immediately after it sets it to []
:
# when nargs='*' on a positional, if there were no command-line
# args, use the default if it is anything other than None
elif (not arg_strings and action.nargs == ZERO_OR_MORE and
not action.option_strings):
if action.default is not None:
value = action.default
else:
value = arg_strings
self._check_value(action, value)
The fix seems to be as simple as moving the check under if action.default is not None
.
(NOTE: This would be also adequately solved by patches already attached to http://bugs.python.org/issue9625, however the minimal solution to this problem is simpler.)
I don't think that this and are the same (although they may have the same root cause, and I would be in favour of fixing both issues). At least, I think the unit test are distinct:
This is that argparse does not accept 0 options is '0 or more' are specified in nargs. Issue9625 is that argparse returns a different type if a default is specified or when it is not.
So I propose to reopen this ticket: it is not fixed, and different from the referred ticket.