【问题标题】:Python argparse doesn't show up help message correctlyPython argparse 未正确显示帮助消息
【发布时间】:2015-07-26 00:39:09
【问题描述】:

我必须解析其中 4 个必须相互绑定的参数,最后 2 个必须是互斥的

group 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 选项运行程序时的帮助部分。

有什么办法吗?

【问题讨论】:

    标签: python arguments argparse


    【解决方案1】:

    我从你的代码中得到的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 没有提供一种机制来做你想做的事。有一些建议的补丁可能会让你到达那里,但现在没有。

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

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

    如果您希望 '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')
    

    我可以向您指出处理“嵌套包容性组”的错误问题,但这目前无济于事。

    【讨论】:

    • ok 似乎是合法的,但这里有另一个问题,我可以停用group1 的帮助消息以将其添加到ArgumentParser 作为epilog 吗?这将是一个很好的解决方法
    • argparse.SUPPRESS 常用于subpress各种类型的帮助输出。我不知道它是否会在这种情况下工作。您可能必须在每个参数中使用它。
    • 啊,就是这样!它做了我想要的:) 现在我可以将该部分添加到主要描述的结语中
    【解决方案2】:

    第 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 组中的每个参数都有一个单独的名称...定义相同的参数 4 次是错误的
    • 是的,如果我所有的 arg 都具有相同的名称 arg 但实际上它们不是...请参阅我的编辑
    • 为什么四个独立的名字对用户来说很重要?本质上,您的要求只是它们提供一组完整的四个(可能相关的)值。强迫他们输入三个额外的选项字符串只是为了这样做只会让使用你的命令变得更加复杂。
    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 2014-01-25
    • 2014-10-07
    • 2016-06-21
    • 2015-06-19
    • 1970-01-01
    • 2012-08-17
    • 2013-04-28
    相关资源
    最近更新 更多