argsparse группы взаимоисключающие - PullRequest
1 голос
/ 16 февраля 2020

Интересно, можно ли создавать взаимоисключающие группы, а не только аргументы.

Приведенный ниже код отлично работает с группами.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("p1")

group_infra_role = parser.add_argument_group("Group1")
group_infra_role.add_argument("--p2")
group_infra_role.add_argument("--p3")

group_custom_role = parser.add_argument_group("Group2")
group_custom_role.add_argument("--p4")
group_custom_role.add_argument("--p5")
args = parser.parse_args()
print(args)

Он сгенерировал вывод, как показано ниже:

$ ./demo-argsparser.py -h
usage: demo-argsparser.py [-h] [--p2 P2] [--p3 P3] [--p4 P4] [--p5 P5] p1

positional arguments:
  p1

optional arguments:
  -h, --help  show this help message and exit

Group1:
  --p2 P2
  --p3 P3

Group2:
  --p4 P4
  --p5 P5

Я хотел бы настроить его таким образом, чтобы при предоставлении любого аргумента из Group1 он был взаимоисключающим от Group2 и наоборот.

Как и код ниже:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("p1")

group_exclusive = parser.add_mutually_exclusive_group()

group_infra_role = group_exclusive.add_argument_group("Group1")
group_infra_role.add_argument("--p2")
group_infra_role.add_argument("--p3")

group_custom_role = group_exclusive.add_argument_group("Group2")
group_custom_role.add_argument("--p4")
group_custom_role.add_argument("--p5")
args = parser.parse_args()
print(args)

Но это не удалось:

$ ./demo-argsparser.py -h
Traceback (most recent call last):
  File "./demo-argsparser.py", line 17, in <module>
    args = parser.parse_args()
  File "/usr/lib/python3.7/argparse.py", line 1764, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 1796, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/lib/python3.7/argparse.py", line 2002, in _parse_known_args
    start_index = consume_optional(start_index)
  File "/usr/lib/python3.7/argparse.py", line 1942, in consume_optional
    take_action(action, args, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1870, in take_action
    action(self, namespace, argument_values, option_string)
  File "/usr/lib/python3.7/argparse.py", line 1052, in __call__
    parser.print_help()
  File "/usr/lib/python3.7/argparse.py", line 2489, in print_help
    self._print_message(self.format_help(), file)
  File "/usr/lib/python3.7/argparse.py", line 2473, in format_help
    return formatter.format_help()
  File "/usr/lib/python3.7/argparse.py", line 293, in format_help
    help = self._root_section.format_help()
  File "/usr/lib/python3.7/argparse.py", line 224, in format_help
    item_help = join([func(*args) for func, args in self.items])
  File "/usr/lib/python3.7/argparse.py", line 224, in <listcomp>
    item_help = join([func(*args) for func, args in self.items])
  File "/usr/lib/python3.7/argparse.py", line 331, in _format_usage
    action_usage = format(optionals + positionals, groups)
  File "/usr/lib/python3.7/argparse.py", line 406, in _format_actions_usage
    start = actions.index(group._group_actions[0])
IndexError: list index out of range
...