我有以下 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'])
Question
我怎样才能得到arg
的默认值变为list
?
我试过了
我尝试过设置default=['foo']
但这会导致:
prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz')
这是一个旧的但开放的错误/问题的重复
http://bugs.python.org/issue9625 (argparse: Problem with defaults for variable nargs when using choices
)
A positional
with *
得到一些特殊处理。它的默认值总是通过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)
提议的错误/问题补丁对此代码块进行了一些小更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)