Python argparse的默认选择项及其选择范围

88

我正在尝试在Python 3应用程序中使用argparse,其中有一个明确的选择列表,但如果没有指定任何选项,则有默认值。

我的代码如下:

parser.add_argument('--list', default='all', choices=['servers', 'storage', 'all'], help='list servers, storage, or both (default: %(default)s)') 
args = parser.parse_args()
print(vars(args))

然而,当我运行此代码时,我会得到以下带有选项的结果:

$ python3 ./myapp.py --list all
{'list': 'all'}

或者不带选项:

$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument

我是否漏掉了什么?或者说我不能在指定选择项时设置默认值吗?


6
如果不输入--list,则会使用默认设置。 - ShadowRanger
我明白了... 除了我需要告诉它如何列出、创建、删除等操作之外,这个方法还是可行的。 - MVanOrder
4
听起来你需要子命令,而不是一个开关。即使使用nargs='?',当有默认设置时,你也无法区分--list和不传递任何内容的区别。 - ShadowRanger
2个回答

120

nargsconst参数传递给add_argument函数:

parser.add_argument('--list',
                    default='all',
                    const='all',
                    nargs='?',
                    choices=['servers', 'storage', 'all'],
                    help='list servers, storage, or both (default: %(default)s)')

如果您想知道是否传递了不带参数的--list,请删除const参数,并检查args.list是否为None

文档:

nargs'?'

如果可能,将从命令行中消耗一个参数,并作为单个项目生成。如果没有命令行参数,则将生成default的值。请注意,对于可选参数,还有另一种情况 - 选项字符串存在,但后面没有跟随命令行参数。在这种情况下,将生成const的值。

const

当使用选项字符串(如-f--foo)和nargs='?'调用add_argument()时,会创建一个可选参数,该参数可以后跟零个或一个命令行参数。在解析命令行时,如果遇到没有跟随命令行参数的选项字符串,则假定const的值。有关示例,请参阅nargs说明。


2
有点小题大做,但我会使用元组而不是列表:choices=('servers','storage','all') 出于讨论的原因,请参阅[https://dev59.com/3XI-5IYBdhLWcg3wta_w](列表 vs 元组)。 - gerardw

16

感谢 @ShadowRanger。 Subcommands 正是我需要的,与 nargsconst 结合使用。以下是代码:

parser = argparse.ArgumentParser()
subparser = parser.add_subparsers()
parser_list = subparser.add_parser('list')
parser_list.add_argument('list_type', default='all', const='all', nargs='?', choices=['all', 'servers', 'storage'])

parser_create = subparser.add_parser('create')
parser_create.add_argument('create_type', default='server', const='server', nargs='?', choices=['server', 'storage'])

args = parser.parse_args()
pprint(vars(args))

$ python3 ./myapp.py -h
usage: dotool.py [-h] {list,create} ...

Digital Ocean tool

positional arguments:
  {list,create}

optional arguments:
  -h, --help     show this help message and exit

仅列出选项:

$ python3 ./myapp.py list
{'list_type': 'all'}
带参数的列表选项:
$ python3 ./myapp.py list servers
{'list_type': 'servers'}

2
我们可以为位置参数添加帮助描述吗?例如{list,create} - alper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接