【问题标题】:Check what group was used in python argparse检查 python argparse 中使用了哪个组
【发布时间】:2020-06-10 14:59:56
【问题描述】:

我需要使用 ArgumentParser 在 python 中拥有两组互斥的参数。 我使用Jonathanhere建议的方法:

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 组,其他,然后检查命名空间?

【问题讨论】:

  • 如果你给add_subparsers 一个dest 参数,那么它将被设置为group_1group_2

标签: python argparse


【解决方案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')
          =======

如您所见,每个组都有自己的指示符,表明该组已被使用。

【讨论】:

    【解决方案2】:

    好吧,简单的答案是使用

    if hasattr(args, 'group_1_arg1'):
    

    对于其他论点也是如此。

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2017-03-02
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 2012-01-05
      • 2012-04-17
      • 1970-01-01
      • 2016-11-06
      相关资源
      最近更新 更多