выбор python argparse с выбором по умолчанию
Я пытаюсь использовать argparse в приложении Python 3, где есть явный список вариантов, но по умолчанию, если ни один из них не указан.
код у меня есть:
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
Я что-то пропустил? Или я не могу иметь значение по умолчанию с указанными вариантами?
2 ответов
передать nargs
и const
аргументы 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
is None
.
Спасибо @ShadowRanger. Subcommands
- это именно то, что мне нужно, в сочетании с nargs
и const
. Следующие работы:
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'}