当我使用子解析器时,子解析器是可选参数,我必须选择其中一个。现在,我想实现在传入子部分中未定义的选项参数(例如add_codition
(时传入默认选项的功能。
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('add_condition', nargs='*')
subparsers = parser.add_subparsers(help='sub-command help', dest="character")
subparsers.required = False
# create the parser for the "a" command
parser_a = subparsers.add_parser('a', help='a help')
parser_a.add_argument('--bar', choices='ABC', help='bar help')
# create the parser for the "b" command
parser_b = subparsers.add_parser('b', help='b help')
parser_b.add_argument('--baz', choices='XYZ', help='baz help')
但是,当我传入子解析器和b解析器没有的选项时,例如key=value
。理论上key=value
应该在add_codition
中通过。
程序结果总是提示:error: argument character: invalid choice: 'key' (choose from 'a', 'b')
python版本为3.6.9。
您正在添加"add condition"作为位置参数。如果您试图执行key=value类型的参数,则需要使用可选参数。位置参数不带键。
位置自变量的一些示例是cd
命令或ls
命令的路径
cd ~/Documents
# ~/Documents is the positional argument
ls .
# . is the positional argument
可选参数可以构造为键值对,也可以用作布尔标志。例如,在cli中,对于使用--config
并后跟文件名的curl
程序,curl会将该特定文件名用作配置文件。这是键值对的一个例子。同样在curl中,您可以使用--get
,它可以被解释为get=True
,并告诉程序发送get请求,而不是默认的post请求。
因此,如果您正在尝试使用key=value
,它应该更像这样。您仍然可以指定nargs="*"则解析器将把key=
后面的所有内容都看作是一个包含多个空格分隔项的单个列表参数,或者直到它找到另一个有效参数为止。
parser.add_argument("--key", action='store', help="requires a value")