В настоящее время у меня есть инструмент CLI, который я создаю, и я хочу придать ему форму, подобную этой.
usage: PROG SUBPARSER [-h]
(-l {optionA,optionB,optionC} | -s TERM [-a, [-b, [-c]]])
Что я делаю, так это то, что у меня есть основной модуль cli, который импортирует все функции arguments_parser из всех модулей, которые я хочу предоставить пользователю, и динамически добавляет их в основной парсер как sub parsers
приведенный ниже код Python немного отличается от функции, которая добавляет парсер к основному парсеру, являясь парсером объекта типа ArgumentParser, который может быть корневым парсером или вспомогательным парсером. (Я делаю это для каждого модуля, чтобы их методы были представлены как CLI).
Теперь то, что я пытаюсь сделать в этом конкретном случае, это иметь команду, скажем, PROG с первым аргументом SUBPARSER, которая имеет две (возможно, больше) взаимоисключающие последовательности аргументов (без создания новых подпарсеров), говоря, что у меня есть две функции, search и list так
поиск и список могут иметь общие аргументы (которые будут передаваться вспомогательному синтаксическому анализатору, а не группе), но есть также флаги и аргументы, которые используются исключительно с --list или --search, для создания таких команд, как
PROG SUBARSER --list optionA -a -o -b
PROG SUBARSER --list optionA -a -o
PROG SUBARSER --list optionA -a -b
PROG SUBARSER --list optionA -a
PROG SUBARSER --list optionA
PROG SUBARSER --search TERM -a -k
PROG SUBARSER --search TERM -c
PROG SUBARSER --search TERM
Я пытался добавить в парсер вложенные группы с взаимоисключающими и обычными группами, но это не позволяет мне (или, по крайней мере, я не нашел способ), иметь взаимоисключающие группы с несколькими аргументами, а не только один флаг или атрибут.
Это то, что у меня есть до сих пор, что не падает и действительно работает с пользой.
usage: PROG SUBPARSER [-h]
[-l {all,draft,staged,publish,build,not-build} | -s SEARCH]
def argument_parser(parser):
"""Argument parser for SUBPARSER subgroup"""
group = parser.add_mutually_exclusive_group(required=False)
group.add_argument('-l','--list',
choices=status_criterias,
help='List the content specified',
default='all'
)
group.add_argument('-s','--search',
help='Search by title from all the content')
Пожалуйста, не обращайте внимания на строки справки.
Любая помощь?
хорошо, но есть ли способ добавить две группы, которые исключают друг друга?
Вы имеете в виду xor (any(a,b,c), any(d,e,f))? Нет.
да, я борюсь с частью xorg, но в итоге должно получиться что-то вроде and(any(g, h i), xor (any(a,b,c), any(d,e,f)))






Взаимоисключающие группы — это очень простой тест — плоский
xor. Никаких подгрупп илиany/andлогики.argument_group— это несвязанный механизм группировки справки. Любое тестирование лучше всего проводить после синтаксического анализа.