Python argparse 没有正确显示帮助信息

Python argparse doesn't show up help message correctly

我必须解析参数,其中 4 个必须相互关联,最后 2 个必须互斥

第 1 组 sub_exclusive_1 有 4 个参数,如果其中任何一个已定义,则必须定义所有参数。

第 2 组 sub_exclusive_2 有 2 个参数,其中只有 1 个可以定义,但前提是第 1 组的 none 已被定义。

parser = argparse.ArgumentParser(description='Main Description', epilog='Main Epilog')
group_exclusive = parser.add_argument_group('Exclusive')
root_exclusive = group_exclusive.add_mutually_exclusive_group()

sub_exclusive_1 = root_exclusive.add_argument_group()
sub_exclusive_1.add_argument("--firstList", action='store', help = "Help for firstList")
sub_exclusive_1.add_argument("--secondList", action='store', help = "Help for secondList")
sub_exclusive_1.add_argument("--thirdList", action='store', help = "Help for thirdList")
sub_exclusive_1.add_argument("--fourthList", action='store', help = "Help for fourthList")

sub_exclusive_2 = root_exclusive.add_mutually_exclusive_group()
sub_exclusive_2.add_argument("--last", action='store_true', help = "Help for Last")
sub_exclusive_2.add_argument("--first", action='store_true', help = "Help for First")

问题是:

  1. 不能将第 1 组参数相互联系起来。

  2. 当设置 sub_exclusive_1add_argument_group 而不是 add_mutually_exclusive_groupfirstList ... fourthList 未显示在 运行 程序带有 -h 选项时的帮助部分。

有什么解决办法吗?

第 1 组不应是四个单独的参数,而是具有 4 个参数的单个选项:

add_argument("--arg", nargs=4)

那么command --arg1 2 --arg2 3 --arg3 5 --arg4 7就变成了command --arg 2 3 5 7;您需要相应地调整您的代码。一种选择是在解析后调整存储在命名空间中的值:

args = p.parse_args()
# Unpack the 4-tuple into the destinations used by your original parser
args.arg1, args.arg2, args.arg3, args.arg4 = args.arg

另一种方法是为 --arg 定义一个自定义操作,它会立即将 4 个值分配给命名空间中的正确目标。

那么你可以定义一个包含--arg--first--last的独占组。

我从你的代码中得到的 print_help

In [420]: parser.print_help()
usage: ipython3 [-h] [--firstList FIRSTLIST] [--secondList SECONDLIST]
                [--thirdList THIRDLIST] [--fourthList FOURTHLIST]
                [[--last | --first]

optional arguments:
  -h, --help  show this help message and exit

Exclusive:
  --last      Help for Last
  --first     Help for First

所有参数都出现在 usage 中,但只有 exclusive_group 出现在帮助中。用法中这个组的括号乱七八糟。

argparse 没有提供一种机制来做你想做的事。有一些提议的补丁可能会让你到达那里,但现在没有。

A 'argument group' 只是一个帮助行显示机制。它不影响使用格式,也不影响解析。此外,不能嵌套参数组 - 接受参数,但不会出现在帮助中。

互斥组可以嵌套在参数组中(用于帮助行显示)。但效果只是在该组中显示其参数。

如果您希望 'first'、'second' 等一起出现,请将它们设为 nargs=4 参数的值,或者在解析后测试它们。类似于:

 group = [args.first, args.second, args.third, args.fourth]
 if any([x is None for x in group]):
     parser.error('all of the inclusive group is required')

我可以向您指出处理 'nested inclusive groups' 的错误问题,但现在这对您没有帮助。