Применять необработанное форматирование только к эпилогу, а не к описаниям парсера и групп аргументов

Я определил интерфейс командной строки моей программы с помощью argparse, и я хотел бы привести несколько примеров в эпилоге. По умолчанию модуль argparse удаляет лишние пробелы, обертывает тексты описания и т. Д. Это поведение по умолчанию очень полезно для описания программы и для описаний групп аргументов, но для эпилога я хотел бы предоставить предварительно отформатированную строку, парсер не должен изменять. Если я укажу formatter_class=RawDescriptionHelpFormatter, это даст желаемое поведение для эпилога, но я потеряю поведение по умолчанию, на которое я полагаюсь для описаний программ и групп аргументов. Я могу вернуться и вручную исправить упаковку этих описаний, но это утомительно.

Есть ли способ применить необработанное форматирование только к эпилогу?


person Daniel Standage    schedule 30.05.2017    source источник


Ответы (1)


Этот форматировщик изменяет один метод _fill_text:

class RawDescriptionHelpFormatter(HelpFormatter):
    ....
    def _fill_text(self, text, width, indent):
        return ''.join(indent + line for line in text.splitlines(keepends=True))

Это обрабатывает перенос для всего, что определено как text в методе format_help

def format_help(self):
    formatter = self._get_formatter()

    # usage
    formatter.add_usage(self.usage, self._actions,
                        self._mutually_exclusive_groups)

    # description
    formatter.add_text(self.description)

    # positionals, optionals and user-defined groups
    for action_group in self._action_groups:
        formatter.start_section(action_group.title)
        formatter.add_text(action_group.description)
        formatter.add_arguments(action_group._group_actions)
        formatter.end_section()

    # epilog
    formatter.add_text(self.epilog)

    # determine help from format above
    return formatter.format_help()

То есть description, group.description и epilog.

Я могу представить себе создание альтернативного подкласса Formatter, который изменяет только оболочку эпилога (может быть идентифицирован каким-то ключевым словом). Но я оставлю это читателю в качестве упражнения. :)

person hpaulj    schedule 30.05.2017