Хотя ответ Джонатана отлично подходит для сложных вариантов, существует очень простое решение, которое будет работать для простых случаев, например, 1 вариант исключает 2 других варианта, например, в
command [- a xxx | [ -b yyy | -c zzz ]]
или даже как в исходном вопросе:
pro [-a xxx | [-b yyy -c zzz]]
Вот как бы я это сделал:
parser = argparse.ArgumentParser()
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)
parser.add_argument("-a", "--aggregation", help="aggregation",
required=False)
Я использую здесь параметры, данные оболочке командной строки для запроса mongodb. collection
Экземпляр может либо вызвать метод aggregate
или метод find
с для дополнительных аргументов query
и fields
, следовательно , вы видите , почему первые два аргумента является совместимым и последним не является.
Итак, теперь я бегу parser.parse_args()
и проверяю его содержимое:
args = parser().parse_args()
print args.aggregation
if args.aggregation and (args.query or args.fields):
print "-a and -q|-f are mutually exclusive ..."
sys.exit(2)
Конечно, этот небольшой прием работает только в простых случаях, и было бы кошмаром проверять все возможные варианты, если у вас есть много взаимоисключающих вариантов и групп. В этом случае вам следует разбить свои параметры на группы команд, как предложил Джонатан.