argparse:如何配置多选、多值、可选参数?
argparse: how to configure multiple choice, multiple value, optional argument?
我正在尝试设置一个参数,该参数接受给定选项列表中的一个或多个值,但不是强制性的。我正在尝试这个(有几个变体也没有按预期工作):
parser.add_argument("FLAGS", nargs='*', choices=["X","Y","Z","ALL"])
我希望从选项列表中得到一个值列表,如果没有给出任何值,我希望得到一个空列表(我认为 nargs='*'
应该强制执行)。但是无论我是否添加 default=""
或不添加,当我不传递任何参数时它都会失败:
error: argument FLAGS: invalid choice: []
如何实现我所需要的?
这可能不符合您的需求,但您可以使用 --flags
.
等选项轻松完成
parser.add_argument(
"--flags",
nargs='*',
default=[], # Instead of "None"
choices=["X", "Y", "Z", "ALL"])
args = parser.parse_args()
print(args)
$ tmp.py
Namespace(flags=[])
$ tmp.py --flags
Namespace(flags=[])
$ tmp.py --flags X
Namespace(flags=['X'])
$ tmp.py --flags X Z
Namespace(flags=['X', 'Z'])
$ tmp.py --flags foobar
usage: tmp.py [-h] [--flags [{X,Y,Z,ALL} ...]]
tmp.py: error: argument --flags: invalid choice: 'foobar' (choose from 'X', 'Y', 'Z', 'ALL')
$ tmp.py --help
usage: tmp.py [-h] [--flags [{X,Y,Z,ALL} ...]]
optional arguments:
-h, --help show this help message and exit
--flags [{X,Y,Z,ALL} ...]
位置“*”得到一些特殊处理。它的 nargs
满足于空列表(无)。它总是被处理。根据 choices
检查空字符串列表是什么意思?
所以 get_values()
方法的作用是:
# 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)
其中 _check_value
测试 value
是否在 choices
.
中
这样的位置最好与有效的 default
一起使用。
In [729]: p=argparse.ArgumentParser()
In [730]: a=p.add_argument("FLAGS", nargs='*', choices=["X","Y","Z","ALL"])
In [731]: p.parse_args([])
usage: ipython3 [-h] [{X,Y,Z,ALL} [{X,Y,Z,ALL} ...]]
ipython3: error: argument FLAGS: invalid choice: [] (choose from 'X', 'Y', 'Z', 'ALL')
...
针对 choices
测试空列表失败:
In [732]: a.choices
Out[732]: ['X', 'Y', 'Z', 'ALL']
In [733]: [] in a.choices
Out[733]: False
In [734]: 'X' in a.choices
Out[734]: True
如果我们设置一个有效的默认值:
In [735]: a.default='X'
In [736]: p.parse_args([])
Out[736]: Namespace(FLAGS='X')
这种行为是允许我们在 mutually_exclusive_group
.
中使用这样的位置的一部分
如果您不想指定有效的默认值,则将其更改为带标记的参数可以避免该问题。
我正在尝试设置一个参数,该参数接受给定选项列表中的一个或多个值,但不是强制性的。我正在尝试这个(有几个变体也没有按预期工作):
parser.add_argument("FLAGS", nargs='*', choices=["X","Y","Z","ALL"])
我希望从选项列表中得到一个值列表,如果没有给出任何值,我希望得到一个空列表(我认为 nargs='*'
应该强制执行)。但是无论我是否添加 default=""
或不添加,当我不传递任何参数时它都会失败:
error: argument FLAGS: invalid choice: []
如何实现我所需要的?
这可能不符合您的需求,但您可以使用 --flags
.
parser.add_argument(
"--flags",
nargs='*',
default=[], # Instead of "None"
choices=["X", "Y", "Z", "ALL"])
args = parser.parse_args()
print(args)
$ tmp.py
Namespace(flags=[])
$ tmp.py --flags
Namespace(flags=[])
$ tmp.py --flags X
Namespace(flags=['X'])
$ tmp.py --flags X Z
Namespace(flags=['X', 'Z'])
$ tmp.py --flags foobar
usage: tmp.py [-h] [--flags [{X,Y,Z,ALL} ...]]
tmp.py: error: argument --flags: invalid choice: 'foobar' (choose from 'X', 'Y', 'Z', 'ALL')
$ tmp.py --help
usage: tmp.py [-h] [--flags [{X,Y,Z,ALL} ...]]
optional arguments:
-h, --help show this help message and exit
--flags [{X,Y,Z,ALL} ...]
位置“*”得到一些特殊处理。它的 nargs
满足于空列表(无)。它总是被处理。根据 choices
检查空字符串列表是什么意思?
所以 get_values()
方法的作用是:
# 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)
其中 _check_value
测试 value
是否在 choices
.
这样的位置最好与有效的 default
一起使用。
In [729]: p=argparse.ArgumentParser()
In [730]: a=p.add_argument("FLAGS", nargs='*', choices=["X","Y","Z","ALL"])
In [731]: p.parse_args([])
usage: ipython3 [-h] [{X,Y,Z,ALL} [{X,Y,Z,ALL} ...]]
ipython3: error: argument FLAGS: invalid choice: [] (choose from 'X', 'Y', 'Z', 'ALL')
...
针对 choices
测试空列表失败:
In [732]: a.choices
Out[732]: ['X', 'Y', 'Z', 'ALL']
In [733]: [] in a.choices
Out[733]: False
In [734]: 'X' in a.choices
Out[734]: True
如果我们设置一个有效的默认值:
In [735]: a.default='X'
In [736]: p.parse_args([])
Out[736]: Namespace(FLAGS='X')
这种行为是允许我们在 mutually_exclusive_group
.
如果您不想指定有效的默认值,则将其更改为带标记的参数可以避免该问题。