argparser условные поля в зависимости от опций - PullRequest
5 голосов
/ 09 марта 2019

В настоящее время у меня есть инструмент 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')

Пожалуйста, не обращайте внимания на строки помощи.

Любая помощь?

...