以下是示例代码:
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一起做这个?
答案 0 :(得分:3)
如果你想接受没有`-u'选项的命令行,那么它确实不是必需的。在大多数情况下你想要它,但不是全部。
如果你这样定义fruit
:
ap.add_argument('-f', '--fruit', dest='fruit', choices=fruit_choices,
help='Fruit')
然后'-h'将包含水果名称列表。这是argparse中设计的方法。
如果选择列表太长或太乱,那就是一个问题。
通常,您希望远离使用'required = True'定义'optionals'。 argparse
允许你这样做,但它并不总是很合适。
您也可以查看subparsers
。例如,您可以定义“列表”子分析程序。但您必须为其他操作定义另一个子分析器,例如eat
。
help
和version
,显示列表,然后退出而不处理其他参数。但对于当前的问题,这可能太先进了。