Подпарсеры ограничивают число необязательных аргументов - PullRequest
0 голосов
/ 30 апреля 2019

Я использую подпарсеры, и я хотел бы ограничить количество необязательных аргументов, передаваемых при использовании командной строки.Код ниже.

parser_data_management = subparsers.add_parser('dm', help='data management help')
  parser_data_management.set_defaults(which="dm")
  parser_data_management.add_argument('-delete', '--delete', nargs="+", "Delete index, snapshot, or repository. Optional: If deleting an index, specify fields or log type to delete.")
  parser_data_management.add_argument('-close', '--close', nargs="+", "Close index or indices. Optional: specify fields or log type to close.")
  parser_data_management.add_argument('-open', '--open', nargs="+", "Open index or indices")
  parser_data_management.add_argument('-restore', '--restore', nargs="+", "Restore snapshot")
  parser_data_management.add_argument('-save', '--save', nargs="+", "Create snapshot or repository")
  parser_data_management.add_argument('-compress', '--compress', nargs="+", "Shrink index")
  parser_data_management.add_argument('--watcher', '--watcher', nargs="+", "Create a watcher")

Насколько я понимаю, пользователь потенциально может добавить все опции в один вызов командной строки, что мне не нужно.Поэтому, выбирая опцию «dm», я бы хотел ограничить пользователей, чтобы они могли выбрать только один из аргументов.Возможно ли это с помощью argparse, или мне нужно для этого создать собственную функцию?

1 Ответ

1 голос
/ 30 апреля 2019

Как сказал hpaulj в своем комментарии, вы должны использовать подпарсер следующим образом:

import argparse

parser = argparse.ArgumentParser()

group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-delete', '--delete', action='store_true')
group.add_argument('-close', '--close',action='store_true')

print parser.parse_args()

РЕДАКТИРОВАТЬ ===== (используя ваш первоначальный пример)

import argparse

def inputparser():
    parser = argparse.ArgumentParser(description='data management help')
    subparsers = parser.add_subparsers()
    parser_data_management = subparsers.add_parser('dm', help='data management help')
    parser_data_management.set_defaults(which="dm")
    group = parser_data_management.add_mutually_exclusive_group(required=True)
    group.add_argument('-delete', '--delete', nargs="+", help="Delete index, snapshot, or repository. Optional: If deleting an index, specify fields or log type to delete.")
    group.add_argument('-close', '--close', nargs="+", help="Close index or indices. Optional: specify fields or log type to close.")
    group.add_argument('-open', '--open', nargs="+", help="Open index or indices")
    group.add_argument('-restore', '--restore', nargs="+", help="Restore snapshot")
    group.add_argument('-save', '--save', nargs="+", help="Create snapshot or repository")
    group.add_argument('-compress', '--compress', nargs="+", help="Shrink index")
    group.add_argument('--watcher', '--watcher', nargs="+", help="Create a watcher")

    print parser_data_management.parse_args()
inputparser()

Nothe ((required = True) в определении группы, что заставит вас использовать только один из аргументов.Ни один из аргументов не должен быть обязательным = True, иначе это приведет к ошибке.

...