Пользовательское сообщение об использовании для многозначного аргумента - PullRequest
0 голосов
/ 13 декабря 2018

учитывая что-н.как (или подобное):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

Теперь я хотел бы, чтобы многозначный позиционный аргумент FILES отображался в сообщении об использовании как

usage: cli.py [-h] FILES

вместо

usage: cli.py [-h] FILES [FILES ...]

Любые пошаговые объяснения или указатели приветствуются.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

fbahr, я просто решил погрузиться в исходный код argparse .Я обнаружил, что форматирование использования жестко закодировано, посмотрите здесь .Единственный способ переопределить его - это наследование от HelpFormatter (класс по умолчанию, используемый при создании нового экземпляра ArgumentParser) и сказать парсеру использовать созданный вами класс, использовать свой собственный форматер .Вам нужно будет переопределить"приватный" метод (с префиксом подчеркивания) с именем _format_args , что немного уродливо и анти-шаблонно (фактически единственная причина, по которой вы можете это сделать)сделать это потому, что мы используем Python), но это единственный способ настроить argparse так, как вы хотите.

import argparse

class NArgsCustomUsageHelpFormatter(argparse.HelpFormatter):

    def _format_args(self, action, default_metavar):
        get_metavar = self._metavar_formatter(action, default_metavar)

        if action.nargs == argparse.ONE_OR_MORE:
            result = '%s' % get_metavar(1)
        else:
            result = argparse.HelpFormatter._format_args(self, action, default_metavar)

        return result

parser = argparse.ArgumentParser(formatter_class=NArgsCustomUsageHelpFormatter)

parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

Приведенный выше код просто меняет поведение по умолчанию, если действие будет отформатированонужен хотя бы один аргумент (nargs='+'), иначе он не сделает ничего другого.

This is the output

Надеюсь, это поможет вам!

0 голосов
/ 13 декабря 2018

Это встроенное поведение форматера по умолчанию: source .

Вы можете иметь пользовательский форматер со специальной обработкой для типа nargs="+"Аргументы:

import argparse


class CustomFormatter(argparse.HelpFormatter):
    def _format_args(self, action, default_metavar):
        get_metavar = self._metavar_formatter(action, default_metavar)
        if action.nargs == argparse.ONE_OR_MORE:
            return '%s' % get_metavar(1)
        else:
            return super(CustomFormatter, self)._format_args(action, default_metavar)


parser = argparse.ArgumentParser(formatter_class=CustomFormatter)
parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

Будет распечатано:

usage: cli.py [-h] FILES
cli.py: error: the following arguments are required: FILES
...