如何使用 argparse 列出选项

How to use argparse to list options

示例代码如下:

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' 等参数将列出所有水果。

问题是因为第一个参数是必需的,它永远不会到达那个开关。我知道我可以使 none 成为必需参数,然后自己处理所需参数的检查,但是是否有一种(设计的)方法可以使用 argparse 来做到这一点?

如果您想接受不带 `-u' 选项的命令行,那么它真的不是必需的。在大多数情况下您都需要它,但不是全部。

如果你这样定义fruit

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

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

也就是说,如果选项列表太长或太乱,确实会有点问题。

一般来说,您希望避免使用 'required=True' 定义 'optionals'。 argparse 让你这样做,但它并不总是适合。

您也可以看看 subparsers。例如,您可以定义一个 'list' 子解析器。但是您必须为其他操作定义另一个子解析器,例如 eat.

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