如何让Python Argparse只列出一次选择?

时间:2012-11-20 18:15:00

标签: python argparse

我的代码如下:

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: Lots of choices results in ugly help output略有不同,因为我没有使用两个单独的选项,并且可以将所有选项全部放在上面。

3 个答案:

答案 0 :(得分:11)

我认为您可能需要多个add_arguments(),并且只将选项放在您想要选择的选项上。

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)

答案 1 :(得分:4)

谢谢,@ thomas-schultz。我不知道add_argument的顺序方面,你的评论让我走上正轨,并结合其他线程的评论。

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

输出如下:

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

比原版更干净。

答案 2 :(得分:0)

这是我在经过一些调整后确定的代码,对于评论来说太大了:(

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()

输出如下:

(用法,然后是选项列表:)

- othername {foo,bar,baz}

至少需要-n,-o, - name或--othername中的一个,它们都做同样的事情。