Как обрабатывать зависимые аргументы, используя argparse? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь настроить argparse так, чтобы действовали только следующие комбинации аргументов:

--flagA --argument1 val1 --argument2 val2 --argument3 val3
--flagB --argument1 val1

До сих пор я написал следующий фрагмент кода, однако он не работает как--argument2 и --argument3 являются необязательными:

required_args = arg_parser.add_argument_group()
required_args.add_argument('--argument1', required=True)

# Optional arguments
optional_args = arg_parser.add_argument_group()
optional_args.add_argument('--argument2', required=False)
optional_args.add_argument('--argument3', required=False)

# Flags
flag_group = arg_parser.add_mutually_exclusive_group(required=True)
flag_group.add_argument('--flagA', dest='flag', action='store_const', const="flagA")
flag_group.add_argument('--flagB', dest='flag', action='store_const', const="flagB")

args = vars(arg_parser.parse_args())

С этой настройкой --flagA --argument1 val1 также есть, но не должно быть.

Я знаю, что могу обработать Namespace, сгенерированный после вызова .parse_args(), и проверить, предоставляются ли --argument2 и --argument3 при пропуске --flagA, однако я ищу более естественный способдостичь этого.

По сути, определение должно выглядеть следующим образом:

[-h] --argument1 ARGUMENT1 (--flagA --argument2 ARGUMENT2 --argument3 ARGUMENT3 | --flagB)

1 Ответ

2 голосов
/ 07 ноября 2019

Рассматривали ли вы использование подпарсера для двух флагов?

что-то вроде

arg_parser = argparse.ArgumentParser()

subparser = arg_parser.add_subparsers(dest="flag", required=True)

flag_a = subparser.add_parser('flagA')
flag_a.add_argument('--argument1', required=True)
flag_a.add_argument('--argument2', required=True)
flag_a.add_argument('--argument3', required=True)

flag_b = subparser.add_parser('flagB')
flag_b.add_argument('--argument1', required=True)

Надеюсь, это поможет

...