Python argparse无法正确显示帮助消息

2024-04-29 18:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须分析参数,其中4个必须相互关联,最后2个必须排他

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

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

有什么解决办法吗?在


Tags: storeaddfor参数定义grouphelpaction
2条回答

我从您的代码中得到的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参数的值,或者在解析后测试它们。比如:

^{pr2}$

我可以给你指出处理“嵌套的包含性组”的bug问题,但这现在没有帮助。在

组1不应该是四个独立的参数,而是一个带有4个参数的单个选项:

add_argument(" arg", nargs=4)

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

^{pr2}$

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

然后可以定义一个包含 arg first、和{}的排他组。在

相关问题 更多 >