我需要在python中使用ArgumentParser拥有两组互斥的参数。我使用的方法是 乔纳森 此处:
subparsers = parser.add_subparsers(help = "You should explicitly specify either group_1 or gropup_2")
parser_g1 = subparsers.add_parser("group_1")
parser_g1.add_argument("group_1_arg1")
parser_g2 = subparsers.add_parser("group_2")
parser_g2.add_argument("group_2_arg1")
parser_g2.add_argument("group_2_arg2")
这看起来是正确的方法,但问题是如何确定在运行时选择了哪个组。group_1
我得到异常分配 args.group_2_arg1
和 args.group_2_arg2
.如果第一个参数是 group_2
我得到异常分配 args.group_1_arg1
种类的例外 'Namespace' object has no attribute 'group_1_arg1'
有什么方法可以检查使用了哪个 paser group,除了检查 Namespace?
正如你所提到的,你可以使用 hasattar
. 但是,如果有很多参数和参数的组合,你可以使用 set_defaults
的功能(请注意星号代码)。
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help = "You should explicitly specify either group_1 or gropup_2")
parser_g1 = subparsers.add_parser("group_1")
parser_g1.add_argument("group_1_arg1")
parser_g1.set_defaults(group=1) # ***
parser_g2 = subparsers.add_parser("group_2")
parser_g2.add_argument("group_2_arg1")
parser_g2.set_defaults(group=2) # ***
args = parser.parse_args()
print(args)
当运行这个脚本时,
./my_script.py group_1 group_1_arg1
结果是:
Namespace(group=1, group_1_arg1='group_1_arg1')
=======
正如你所看到的,每个组都有自己的指示器,表明该组被使用了。
好吧,琐碎的答案是使用
if hasattr(args, 'group_1_arg1'):
其他论点也是如此。