我有以下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以下参数来调用该程序:
foo
./prog.py foo
Namespace(arg=['foo'])
问题
我怎样才能让arg的默认值变成list?
arg
list
我试过了
我尝试过设置default=['foo']但结果是:
default=['foo']
prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz')
这里的问题是将其argparse解释default=['foo']为列表,与预期的单个字符串选择('foo','bar','baz')不匹配。设置nargs='*'允许多个值,但如果没有任何参数,它将arg默认视为空列表,而不是使用您指定的默认值。
argparse
'foo'
'bar'
'baz'
nargs='*'
为了确保arg始终是一个列表(包括未提供任何参数的情况),您可以将默认值设置为None,并在解析后处理为空的情况arg。具体操作如下:
None
#!/usr/bin/env python import argparse parser = argparse.ArgumentParser() parser.add_argument('arg', choices=['foo', 'bar', 'baz'], nargs='*', default=None) args = parser.parse_args() # Set default list value if `arg` is None or an empty list if args.arg is None or len(args.arg) == 0: args.arg = ['foo'] print(args)
default=None
args.arg
[]
['foo']
输出:
这样,arg即使使用默认值,也将始终是一个列表。