Как аргументировать взаимно оправдывающую группу?

#python #parameters #arguments #command-line-interface #argparse

Вопрос:

У меня есть взаимоисключающая группа, из которой пользователь может выбирать --execute, --delete, --create . Как я могу сделать аргументы доступными только для определенных групп? Например --execute {filename} , --create -fn {filename} -p {path} И. --delete {filename} Как я могу сгруппировать необязательные аргументы, чтобы их можно было использовать только в определенной группе?

Комментарии:

1. Взгляните на субпарсеры

2. Конечно, но как бы я это реализовал add_mutually_exclusive_group , если бы не было примера? @Вомбат

3. Команды из вспомогательных анализаторов уже являются взаимоисключающими. Вам не нужна эта функция.

4. Ладно! Но тогда это невозможно использовать -e ? Написание execute требует времени и немного раздражает…. @Вомбат

5. Взаимоисключающие группы являются плоскими — xor. Они не реализуют какие-либо какие-либо/все подгруппы.

Ответ №1:

Три «опции» --execute --delete и --create выглядят так , как будто они должны быть подкомандами, а не необязательными флагами.

Для этого используйте ArgumentParser.add_subparsers()

 from argparse import ArgumentParser


parser = ArgumentParser()
sub = parser.add_subparsers()

execute = sub.add_parser('execute')
execute.add_argument('filename')

create = sub.add_parser('create')
create.add_argument('-fn')
create.add_argument('-p')
 

Использование затем

  • program execute {filename}
  • program create -fn {filename} -p {path}

Вы даже можете создать псевдоним для вспомогательных анализаторов:

 sub.add_parser('execute', aliases=['e'])
 

Это также позволяет вам вызывать программу следующим образом:

  • program e {filename}

Примечание:

Невозможно использовать --execute или -e в качестве команды для вспомогательного синтаксического анализатора, поскольку при вводе program --execute {filename} --execute часть интерпретируется как флаг для корневого синтаксического анализатора, а не как вспомогательная команда.