【问题标题】:python argparse choices with a default choice带有默认选项的python argparse选项
【发布时间】:2017-03-12 11:37:03
【问题描述】:

我正在尝试在 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

我在这里遗漏了什么吗?或者我可以没有指定选项的默认值吗?

【问题讨论】:

  • 不要传递--list,将使用您的默认值。
  • 我明白了...除了我需要告诉它列出、创建、删除等这一事实之外,这可行。
  • 听起来你想要subcommands,根本不是开关。即使使用nargs='?',您也无法区分--list 和默认设置时不传递任何内容。

标签: python python-3.x argparse


【解决方案1】:

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

【讨论】:

【解决方案2】:

感谢@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'}

【讨论】:

  • 我们可以为位置参数添加帮助描述吗?比如{list,create}
猜你喜欢
  • 2013-07-06
  • 2016-08-11
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多