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

时间:2015-05-14 11:49:03

标签: python arguments argparse

我必须解析其中4个必须相互捆绑的论点,最后2个必须是独占的

组1 sub_exclusive_1有4个参数,如果定义了任何参数,则必须定义所有参数。

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

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_1设为add_argument_group而非。{ add_mutually_exclusive_groupfirstList ... fourthList未显示在。{ 使用-h选项运行程序时的帮助部分。

  3. 任何解决方案?

2 个答案:

答案 0 :(得分:0)

第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的专属论坛。

答案 1 :(得分:0)

我从您的代码中获得的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'论证组'只是一个帮助线显示机制。它不会影响使用格式,也不会影响解析。此外,参数组不能嵌套 - 参数被接受,但不会出现在帮助中。

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

如果您希望第一个','秒'等一起发生,请将它们设为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')

我可以向您指出处理嵌套包容性群组的错误问题,但现在没有帮助。