Вложенные парсеры argparse и сообщение помощи - PullRequest
0 голосов
/ 14 сентября 2018

Ситуация

Один модуль (назовем его A) реализует «основной» анализатор argparse, который анализирует известные аргументы, общие для всех дочерних классов (используя parser.parse_known_args(argv)). Затем он передает оставшиеся аргументы другому объекту, который он вызывает. Предположим, что это может быть либо объект класса B, либо C. И B, и C имеют свои собственные парсеры argparse, которые анализируют оставшиеся аргументы (используя parser.parse_args(argv)). Они принимают разные аргументы, специфичные для класса B или C.

Пример фрагмента из класса A:

parser = argparse.ArgumentParser(
    description="Parent parser",
    formatter_class=argparse.RawTextHelpFormatter,
    allow_abbrev=False
)
parser.add_argument('--argument_A', action="append", default=None,
                          help="Help of first argument of parser A")
known, remaining_args = parser.parse_known_args(argv)
my_obj = self.create_obj(b_or_c, remaining_args)

Пример фрагмента из класса B:

parser = argparse.ArgumentParser(
        description="Class B parser",
        formatter_class=argparse.RawTextHelpFormatter,
        allow_abbrev=False
    )
    parser.add_argument('--argument_B', action="append", default=None,
                              help="Help of first argument of parser B")
    B_arguments_parsed = parser.parse_args(argv)

Пример фрагмента из класса C:

parser = argparse.ArgumentParser(
        description="Class C parser",
        formatter_class=argparse.RawTextHelpFormatter,
        allow_abbrev=False
    )
    parser.add_argument('--argument_C', action="append", default=None,
                              help="Help of first argument of parser C")
    C_arguments_parsed = parser.parse_args(argv)

Хотя реализовать передачу аргументов и их анализ в нужных местах было легко, я не нашел простого решения для вывода правильной справки.

Вопрос

Как реализовать справочное сообщение, чтобы мой родительский парсер (из класса A) печатал свою собственную справку и справку из парсера B или C?

Я хотел бы видеть справочное сообщение от парсера A и, в зависимости от того, какой объект был выбран, парсер B или C.

...