检查在python argparse中使用了什么组别

问题描述 投票:0回答:1

我需要在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_arg1args.group_2_arg2.如果第一个参数是 group_2 我得到异常分配 args.group_1_arg1

种类的例外 'Namespace' object has no attribute 'group_1_arg1'有什么方法可以检查使用了哪个 paser group,除了检查 Namespace?

python argparse
1个回答
1
投票

正如你所提到的,你可以使用 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')
          =======

正如你所看到的,每个组都有自己的指示器,表明该组被使用了。


1
投票

好吧,琐碎的答案是使用

if hasattr(args, 'group_1_arg1'):

其他论点也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.