Argparse: Как объявить несколько групп аргументов взаимоисключающими для одной подкоманды?Как определить несколько способов использования подкоманды? - PullRequest
1 голос
/ 28 сентября 2019

Мне нужно реализовать командную строку, для которой есть несколько способов использования подкоманды.

Пример:

Для этого простого «git merge» есть 2 способа:используя его, которые являются взаимоисключающими.

1) git merge (--continue | --abort | --quit)
2) git merge [--no-commit] [-m <msg>] [<commit>​]

Мой вопрос:

Используя argparse, как реализовать синтаксический анализатор для этого простого примера?

Я использовал:

  • "add_subparsers" для создания подкоманды слияния.
  • "add_mutually_exclusive_group" для представления "(--continue | --abort |--quit) ".
  • " add_argument_group "для повторной отправки второго способа использования.

Вот мой код:

# Template command
parser_template = subparsers.add_parser('merge')

groupA = parser_template.add_argument_group('When merge is on-going')
excl_group = groupA.add_mutually_exclusive_group(required=True)
excl_group.add_argument('--continue', action='store_true')
excl_group.add_argument('--abort', action='store_true')
excl_group.add_argument('--quit', action='store_true')

groupB = parser_template.add_argument_group('Start a merge')
groupB.add_argument('--no-commit', action='store_true')
groupB.add_argument('-m', metavar='<msg>')
groupB.add_argument('commit', metavar='<commit>')

Справочное сообщение::

(venv) >> git merge -h
usage: git merge [-h] [--no-commit] [-m <msg>]
                 (--continue | --abort | --quit)
                 <commit>

optional arguments:
  -h, --help   show this help message and exit

When merge is on-going:
  --continue
  --abort
  --quit

Start a merge:
  --no-commit
  -m <msg>
  <commit>

Однако группа A и группа B еще не являются взаимоисключающими между собой.Мы можем видеть это из части «использование», и эта команда работает, пока она не имеет смысла:

(venv) >> git merge --no-commit --continue 34567

Как groupA и groupB могут стать взаимоисключающими?

Наконец, если argparseне может, существует ли другая библиотека с этой функцией?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 29 сентября 2019

Найдено 2 дубликата:

Краткое описание: На данный момент это невозможно.Чтобы обойти, есть одна возможность, если проверять аргументы вручную после разбора, или разбить подкоманду на 2 разные подкоманды.

Открыта проблема: https://bugs.python.org/issue11588

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...