Механизм взаимоисключающей группы предназначен только для простого (плоского) эксклюзивного или группового. Не существует механизма вложения одной группы в другую или для применения другой логики (and
, any
и т. Д.).
Вам необходимо выполнить собственное тестирование после разбора. Пока значения по умолчанию являются разумными (например, по умолчанию None
), что не сложно.
Subparsers предоставляют другую логику группировки, которая может работать на вас.
Это было поднято в других вопросах SO и проблема/проблема Python, если вам нужно изучить его более подробно.
===============
argument groups
, несмотря на название, не работает с взаимоисключающими группами. Их цель цели совершенно другая (группировка линий помощи). Вы можете вложить одну взаимоисключающую группу в другую, но чистый эффект состоит в том, чтобы поместить все в одну группу.
argparse: some mutually exclusive arguments in required group
============================
import argparse
usage = '%(prog)s [A | [B ? C]]'
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('-a')
parser.add_argument('-b')
parser.add_argument('-c')
args=parser.parse_args()
print(args)
if args.a is not None:
if not(args.b is None and args.c is None):
parser.error('Cannot use b or c with a')
с результатом пробегов
1722:~/mypy$ python3 stack37311550.py -a 1
Namespace(a='1', b=None, c=None)
1726:~/mypy$ python3 stack37311550.py -a 1 -b2
Namespace(a='1', b='2', c=None)
usage: stack37311550.py [A | [B ? C]]
stack37311550.py: error: Cannot use b or c with a
1726:~/mypy$ python3 stack37311550.py -c3 -b2
Namespace(a=None, b='2', c='3')
1726:~/mypy$ python3 stack37311550.py -c3 -b2 -a1
Namespace(a='1', b='2', c='3')
usage: stack37311550.py [A | [B ? C]]
stack37311550.py: error: Cannot use b or c with a
Похоже, что вам нужны [подкоманды] (https://docs.python.org/3/library/argparse.html#sub-commands), но дополнительная информация и некоторый пример кода были бы полезны. – ChrisP