Python argparse правильное форматирование аргументов выбора с флагом - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь создать хорошо отформатированные справочные сообщения для аргументов командной строки типа choice с помощью argparse Python. Для команды я разрешаю имя --operation и псевдоним -o. В настоящее время argparse печатает список параметров рядом с обоими в сообщении справки.

Обратите внимание, что этот вопрос отличается от вопроса о форматировании сообщений справки параметров (Эта проблемаздесь есть хороший ответ Anthon: Python argparse: Как вставить новую строку в текст справки? )

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-o', '--operation', help="operation to perform", type=str, choices=["create", "update", "delete"])
_StoreAction(option_strings=['-o', '--operation'], dest='operation', nargs=None, const=None, default=None, type=<class 'str'>, choices=['create', 'update', 'delete'], help='operation to perform', metavar=None)
>>> parser.print_help()
usage: [-h] [-o {create,update,delete}]

optional arguments:
  -h, --help            show this help message and exit
  -o {create,update,delete}, --operation {create,update,delete}
                        operation to perform
>>> 

Моя проблема заключается в этой строке:

  -o {create,update,delete}, --operation {create,update,delete}

Очень неуклюже, как список вариантов повторяется дважды. Тем более, что у меня будут списки, которые еще длиннее. Я думаю, было бы лучше иметь это:

-o, --operation {create,update,delete}

Это, конечно, предполагает, что не существует какого-либо правила POSIX о том, как это должно работать. Я не думаю, что есть.

Как я могу достичь желаемого результата? Или есть веская причина, по которой я не должен пытаться это сделать?

1 Ответ

1 голос
/ 15 октября 2019

Это довольно хак, но, похоже, нет подходящего места для этого.

Определите свой собственный форматер, который переопределяет (путем копирования) метод _format_action_invocation. Единственное изменение, которое вы сделаете, - это добавление вариантов только в строку параметров last .

class MyHelpFormatter(HelpFormatter):

    def _format_action_invocation(self, action):
        if not action.option_strings:
            default = self._get_default_metavar_for_positional(action)
            metavar, = self._metavar_formatter(action, default)(1)
            return metavar

        else:
            parts = []

            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            else:
                default = self._get_default_metavar_for_optional(action)
                args_string = self._format_args(action, default)
                for option_string in action.option_strings[:-1]:
                    parts.append('%s' % (option_string,))
                parts.append('%s %s' % (action.option_strings[-1], args_string)
            return ', '.join(parts)
...