Интересно, можно ли создавать взаимоисключающие группы, а не только аргументы.
Приведенный ниже код отлично работает с группами.
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