Argparse通过子分组互斥

时间:2014-06-03 07:06:46

标签: python argparse

目前我的代码的argparse提供了以下内容:

usage: ir.py [-h] [-q  | --json | -d ]

Some text

optional arguments:
  -h, --help            show this help message and exit
  -q                    gene query terms (e.g. mcpip1)
  --json                output in JSON format, use only with -q
  -d , --file_to_index  file to index 

我想要它做的是:

  1. -q应与-d
  2. 互斥
  3. --json只能使用-q
  4. 它的方法是什么? 这是我的argparse代码:

    parser = argparse.ArgumentParser(description='''Some text''')
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-q",help="gene query terms (e.g. mcpip1)",metavar="",type=str)
    group.add_argument("--json", help="output in JSON format, use only with -q", action="store_true")
    group.add_argument("-d","--file_to_index", help="file to index",metavar="",type=str)
    args = parser.parse_args()
    

    目前拒绝使用-q

    --json
    python ir.py --json -q mcpip1
    usage: ir.py [-h] [-q  | --json | -d ]
    
    ir.py: error: argument -q: not allowed with argument --json
    

2 个答案:

答案 0 :(得分:2)

-q-d并非真正的选择(可能是需要一个选项);他们是子命令,因此您应使用argparse的子分析器功能创建两个子命令queryindex,并仅将--jsonquery关联子命令。

import argparse
parser = argparse.ArgumentParser(description='''Some text''')
subparsers = parser.add_subparsers()

query_p = subparsers.add_parser("query", help="Query with a list of terms")
query_p.add_argument("terms")
query_p.add_argument("--json", help="output in JSON format, use only with -q", action="store_true")

index_p = subparsers.add_parser("index", help="index a file")
index_p.add_argument("indexfile", help="file to index")

args = parser.parse_args()

提供整体计划的帮助
ir.py -h

每个子命令的帮助单独显示

ir.py query -h
ir.py index -h

用法类似于

ir.py query "list of terms"
ir.py query --json "list of terms"
ir.py index somefile.ext

答案 1 :(得分:0)

最简单的方法是将--json添加到parser,而不是group,并在不需要时忽略它。如果您认为自己的帮助热线不足,也可以编写自定义用法。

同样不要害怕在parse_args之后测试共同出现或排除论据。正如您在侧栏上看到的,有很多关于mutually_exclusvie_groups的问题。通常,所需的逻辑超出了简单的分组API所能提供的范围。

如果它符合您所需的语法,subparsers会为您提供混合和匹配参数的更多权力。

类似问题的更长答案是Mutual exclusion between argument groups

理想情况下,usage行会是什么样子? --json是否需要-q或仅允许?