如何使用argparse列出选项

时间:2015-11-18 17:10:47

标签: python argparse

以下是示例代码:

import argparse

fruit_choices = [
    'banana', 
    'pear', 
    'apple',
    'mango',
    'list',  # this will list all the fruit in a user-friendly way
]

ap = argparse.ArgumentParser(description='Fruit selector')
ap.add_argument('-u', '--utensil', dest='utensil', required=True, 
                help='Utensil used to eat fruit.')
ap.add_argument('-f', '--fruit', dest='fruit', required=True, choices=fruit_choices, 
                help='Fruit. Use "list" to see all options.', metavar='')

args = ap.parse_args()

if args.fruit == 'list':
    print '\n'.join(fruit_choices)

虽然这有效,但我希望功能类似于许多Linux工具,其中的参数如' list'将列出所有的水果。

问题是,由于第一个参数是必需的,它永远不会到达那个开关。我知道我可以不需要它们,然后自己处理所需参数的检查,但有没有(设计)方法与argparse一起做这个?

1 个答案:

答案 0 :(得分:3)

如果你想接受没有`-u'选项的命令行,那么它确实不是必需的。在大多数情况下你想要它,但不是全部。

如果你这样定义fruit

ap.add_argument('-f', '--fruit', dest='fruit', choices=fruit_choices, 
            help='Fruit')

然后'-h'将包含水果名称列表。这是argparse中设计的方法。

如果选择列表太长或太乱,那就是一个问题。

通常,您希望远离使用'required = True'定义'optionals'。 argparse允许你这样做,但它并不总是很合适。

您也可以查看subparsers。例如,您可以定义“列表”子分析程序。但您必须为其他操作定义另一个子分析器,例如eat

理论上,我们可以定义一个特殊的Action类,它的行为类似helpversion,显示列表,然后退出而不处理其他参数。但对于当前的问题,这可能太先进了。