Хоча відповідь Джонатана цілком підходить для складних варіантів, існує дуже просте рішення, яке буде працювати в простих випадках, наприклад 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)
Звичайно, цей маленький хакер працює лише для простих випадків, і це стане кошмаром перевірити всі можливі варіанти, якщо у вас є багато взаємовиключних варіантів та груп. У такому випадку вам слід розбити свої варіанти для командних груп, як запропонував Джонатан.