我有以下python程序:
#!/usr/bin/env python import argparse parser = argparse.ArgumentParser() parser.add_argument('arg', choices=['foo', 'bar', 'baz'], default='foo', nargs='*') args = parser.parse_args() print(args)
如果我像这样调用程序:
./prog.py
输出是
Namespace(arg='foo')
但是如果我foo
以参数的形式调用程序:
./prog.py foo
输出是
Namespace(arg=['foo'])
题
如何才能获得arg
默认值list
?
我试过了
我尝试过设置,default=['foo']
但结果是:
prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz')
hpaulj.. 6
这是一个旧的,但是开放的bug /问题的副本
http://bugs.python.org/issue9625 ( argparse: Problem with defaults for variable nargs when using choices
)
A positional
与*
得到一些特殊处理.choices
如果您不提供值,则默认值始终通过测试.
将其与一个案例进行比较 optional
In [138]: p=argparse.ArgumentParser() In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*') In [140]: p.parse_args([]) Out[140]: Namespace(arg=None) In [141]: a.default=['foo'] In [142]: p.parse_args([]) Out[142]: Namespace(arg=['foo'])
接受默认值而不进行测试:
In [143]: a.default=['xxx'] In [144]: p.parse_args([]) Out[144]: Namespace(arg=['xxx'])
相关代码是:
def _get_values(self, action, arg_strings): ... # 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)
建议的错误/问题补丁对此代码块进行了一些小改动.
这是一个旧的,但是开放的bug /问题的副本
http://bugs.python.org/issue9625 ( argparse: Problem with defaults for variable nargs when using choices
)
A positional
与*
得到一些特殊处理.choices
如果您不提供值,则默认值始终通过测试.
将其与一个案例进行比较 optional
In [138]: p=argparse.ArgumentParser() In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*') In [140]: p.parse_args([]) Out[140]: Namespace(arg=None) In [141]: a.default=['foo'] In [142]: p.parse_args([]) Out[142]: Namespace(arg=['foo'])
接受默认值而不进行测试:
In [143]: a.default=['xxx'] In [144]: p.parse_args([]) Out[144]: Namespace(arg=['xxx'])
相关代码是:
def _get_values(self, action, arg_strings): ... # 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)
建议的错误/问题补丁对此代码块进行了一些小改动.