Python argparse: взаимоисключающая группа с некоторыми совместимыми аргументами - программирование

Python argparse: взаимоисключающая группа с некоторыми совместимыми аргументами

Я хотел бы реализовать такую ​​логику в argparse:

If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected

Похоже, add_mutually_exclusive_group - это то, что я хотел бы для этого, но похоже, что вы можете выбрать только один вариант из взаимоисключающей группы, поэтому я не могу поместите все три в взаимоисключающую группу.

Есть ли способ сделать это в argparse?

4b9b3361

Ответ 1

Вы не могли бы сделать это с помощью argparse, однако вы можете сделать это после выполнения argparse.

Вот пример:

parser = argparse.ArgumentParser()

# group 1 
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)

# group 2 
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)

Конечно, этот маленький взлом работает только для простых случаев, и для кошмаров можно было бы проверить все возможные варианты, если у вас есть много взаимоисключающих опций и групп. В этом случае вы должны разбить свои параметры в командных группах. Для этого вам следует следовать предложению взаимной эксклюзивной группы Python argparse.

Ответ 2

Docopt может работать в этом случае.

Он использует трубы для взаимоисключающих элементов.

my_program (aggregate | find [-q | -f])

Ответ 3

Вы можете отрицать значение A, а затем использовать подпараметр. Подпараметры позволяют указать, что "Если и только если выбран A, пользователь может выбрать B или C."

http://docs.python.org/2/library/argparse.html