17

我的代码如下所示:

list_of_choices = ["foo", "bar", "baz"]
parser = argparse.ArgumentParser(description='some description')
parser.add_argument("-n","--name","-o","--othername",dest=name,
    choices=list_of_choices

我得到的输出看起来像:

-n {foo,bar,baz}, --name {foo,bar,baz}, -o {foo,bar,baz}, 
--othername {foo,bar,baz}

我想要的是:

-n, --name, -o, --othername {foo,bar,baz}

就上下文而言,我们需要为同一个选项提供两个名称是有历史原因的,而实际的选项列表有 22 个元素长,所以它看起来比上面的要糟糕得多。

这个问题与 Python argparse 略有不同:很多选择会导致难看的帮助输出,因为我没有使用两个单独的选项,并且可以将它们全部放在上面。

4

3 回答 3

16

我认为您可能想要多个add_arguments(),并且只设置choices在您想要选择的那个上。

list_of_choices = ["foo", "bar", "baz"]
parser = argparse.ArgumentParser(description='some description')
parser.add_argument("-n")
parser.add_argument("--name")
parser.add_argument("-o")
parser.add_argument("--othername", dest='name',
    choices=list_of_choices)
于 2012-11-20T18:24:34.963 回答
4

谢谢,@thomas-schultz。我不知道 add_argument 的顺序方面,您的评论使我走上了正确的轨道,并结合了来自其他线程的评论。

基本上,我现在所做的是将所有四个放在一个互斥组中,抑制前三个的输出,然后将它们包含在组的描述中。

输出如下所示:

group1
   use one of -n, --name, -o, --othername
-n {foo,bar,baz}

这比原来的干净得多。

于 2012-11-20T19:15:37.733 回答
1

这是我经过更多调整后确定的代码:

parser = argparse.ArgumentParser(description='some description', 
    epilog="At least one of -n, -o, --name, or --othername is required"
           " and they all do the same thing.") 
parser.add_argument('-d', '--dummy', dest='dummy',
    default=None, help='some other flag')
stuff = parser.add_mutually_exclusive_group(required=True)
stuff.add_argument('-n', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('-o', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('--name', dest='name', 
    action='store', choices=all_grids, help=argparse.SUPPRESS)
stuff.add_argument('--othername', dest='name', 
    action='store', choices=all_grids, help='')
args = parser.parse_args()

输出-h是用法,然后是选项列表,然后是:

--othername {foo,bar,baz}

At least one of -n, -o, --name, or --othername is required and they all do the same thing.
于 2012-11-20T20:20:02.307 回答