2015-05-14 80 views
0

我要解析的参数,其中其中4必须相互捆绑,而去年2必须是独家Python的argparse不显示帮助消息正确

组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选项运行程序时显示。

任何解决方案?

回答

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出现在帮忙。而这个组的括号在用法上是混乱的。

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

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

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

如果您想要“第一”,“第二”等一起出现,请将它们的值设置为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') 

我可以指出你错误的问题,与“套包组”的交易,但是这不会帮助现在。

+0

确定似乎是合法的,但在这里还有另一个问题,我可以取消激活“group1”的帮助消息,将它作为'epilog'添加到'ArgumentParser'中?这将是一个很好的解决方法 – PYPL

+0

'argparse.SUPPRESS'通常用于表示各种类型的帮助输出。我不知道它是否会在这种情况下工作。您可能需要在每个参数中使用它。 – hpaulj

+0

啊,就是这样!它做我想要的东西:)现在我可以将该部分添加到主说明的结语中 – PYPL

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的排他组。

+0

但是组1中的每个参数都有一个单独的名称......定义相同参数4次会是错误的 – PYPL

+0

您不会;看我的编辑。 – chepner

+0

是的,如果我的所有arg都具有相同的名称'arg'但实际上它们不是...请参阅我的编辑 – PYPL