New submission from Evan: 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.) ---------- components: Library (Lib) messages: 267404 nosy: evan_ priority: normal severity: normal status: open title: argparse fails to parse [] when using choices and nargs='*' type: behavior versions: Python 2.7, Python 3.4, Python 3.5, Python 3.6 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue27227> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com