如何使用 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,其行为类似于 help
和 version
,显示列表,然后退出而不处理其他参数。但这对于当前的问题来说可能太高级了。
示例代码如下:
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,其行为类似于 help
和 version
,显示列表,然后退出而不处理其他参数。但这对于当前的问题来说可能太高级了。