具有默认选择的python argparse选项

MVa*_*der 29 python argparse python-3.x

我正在尝试在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))
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我得到以下选项:

$ python3 ./myapp.py --list all
{'list': 'all'}
Run Code Online (Sandbox Code Playgroud)

或者没有选项:

$ python3 ./myapp.py --list
usage: myapp.py [-h] [--list {servers,storage,all}]
myapp.py: error: argument --list: expected one argument
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*uzo 44

传递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)')
Run Code Online (Sandbox Code Playgroud)

如果你想知道,如果--list没有一个参数传递,取出const参数,并检查是否args.listNone.

  • 有点奇怪,但我会使用元组而不是列表:`choices=('servers','storage','all')`,其原因在[/sf/]中讨论1708510/list-vs-tuple-when-to-use-each](列表与元组) (2认同)

MVa*_*der 8

谢谢@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
Run Code Online (Sandbox Code Playgroud)

仅列出选项:

$ python3 ./myapp.py list
{'list_type': 'all'}
Run Code Online (Sandbox Code Playgroud)

列出带有参数的选项:

$ python3 ./myapp.py list servers
{'list_type': 'servers'}
Run Code Online (Sandbox Code Playgroud)

  • 我们可以为位置参数添加帮助描述吗?例如“{list,create}” (2认同)