Мне нужно реализовать командную строку, для которой есть несколько способов использования подкоманды.
Пример:
Для этого простого «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не может, существует ли другая библиотека с этой функцией?
Спасибо за любую помощь.