Вставка переносов строки в текст справки argparse Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы добавить символы разрыва строки (\n) в текст помощи вашего парсера argparse.ArgumentParser, используйте класс RawTextHelpFormatter:

Python
Скопировать код
import argparse

# Создаем парсер с использованием RawTextHelpFormatter
parser = argparse.ArgumentParser(description="О методе добавления новых строк", formatter_class=argparse.RawTextHelpFormatter)

# Определяем аргумент, в описании которого присутствуют символы разрыва строки
parser.add_argument('--option', type=int, help='Приветствую вас в первой строке\nВстречаемся со второй строкой\nПрошу любить и жаловать: третья строка')
args = parser.parse_args()

Чтобы увидеть результат вставки новых строк, запустите скрипт с ключом --help.

Кинга Идем в IT: пошаговый план для смены профессии

Пользовательский форматтер для выборчного форматирования

Если вам нужно ограничить использование символов разрыва строк, вы можете воспользоваться SmartFormatter. Это пользовательский форматтер, который позволяет управлять форматированием:

Python
Скопировать код
import argparse

class SmartFormatter(argparse.HelpFormatter):
    def _split_lines(self, text, width):
        # Разрешаем символы разрыва строки только там, где строка начинается с 'R|'
        if text.startswith('R|'):
            return text[2:].splitlines()
        # Во всех остальных случаях обрабатываем текст стандартным образом
        return super()._split_lines(text, width)

parser = argparse.ArgumentParser(description='Описание приветствуется', formatter_class=SmartFormatter)
parser.add_argument('--option', help='R|В начале была первая строка\nЗа ней последовала вторая\nОстальные строки остаются без изменений')
args = parser.parse_args()

На Bitbucket вы можете найти более продвинутую версию SmartFormatter с дополнительными функциями, включая возможность вставки значений по умолчанию.

Табличный и читаемый формат

Если вы хотите отформатировать текст, сохраняя табуляцию и строки с переносами, используйте textwrap.dedent. Это позволит устранить висячие отступы и сделать текст более читаемым:

Python
Скопировать код
import argparse
import textwrap

class MultilineFormatter(argparse.HelpFormatter):
    def _fill_text(self, text, width, indent):
        # Обрубаем левые отступы и удаляем начальные/завершающие пробелы
        text = textwrap.dedent(text).strip()
        # Собираем текст, сохраняя новые строки
        return ''.join(indent + line for line in textwrap.wrap(text, width))

parser = argparse.ArgumentParser(description='Многострочное описание', formatter_class=MultilineFormatter)
parser.add_argument('--list', type=str, help=textwrap.indent(textwrap.dedent("""\
    – Первый элемент списка
    – Второй элемент списка
    – И так далее...
"""), "  "))
args = parser.parse_args()

Такой подход позволит сделать каждую строку отдельным и читаемым блоком.

Визуализация

Представьте себе, что вы создаете подробную инструкцию:

Markdown
Скопировать код
📘 Инструкция:
- Завести двигатель [Нажать кнопку 'Старт']
- Использовать навигатор [Ввести место назначения]

Если вы не добавляете разрывы строк, вся информация склеивается в единый блок текста:

Markdown
Скопировать код
🧱📄: Завести двигатель, нажав кнопку 'Старт', ввести адрес в навигатор...

Вставляя новые строки, вы упорядочиваете информацию по отдельным блокам, аналогично расставленному товару на полках магазина:

Markdown
Скопировать код
🔲 Запуск двигателя   🔳 Использование навигации
├─ Нажать кнопку 'Старт'    ├─ Ввести место назначения
└─ (Всё остается на своих местах)  └─ (Информация четко разделена)

От вас зависит, на что будет походить ваш текст: на инструкцию от IKEA или на хорошо структурированный код.

Управляйте своим текстом

Если вам нужно сохранить исходное форматирование текста, примените следующий однострочный пользовательский форматтер:

Python
Скопировать код
import argparse

class PreserveNewlineFormatter(argparse.HelpFormatter):
    def _split_lines(self, text, width):
        # сохраняем разрывы строки для каждой строки
        return text.splitlines()

parser = argparse.ArgumentParser(description="Сохраняем переносы строк", formatter_class=PreserveNewlineFormatter)
parser.add_argument('--manual', help='Строка No1\nСтрока No2\nДа, всё так аккуратно и четко!')
args = parser.parse_args()

Такой подход позволяет сохранить первоначальное формирование всех строк.

Тонкости и потенциальные проблемы

Создание собственных форматтеров может решить сложные задачи, например, форматирование многострочных блоков кода или цитат. Однако будьте осторожны с длинными строками: из-за ограничения ширины терминала текст справки может стать нечитабельным. Тестируйте свой скрипт на различных размерах экрана, чтобы избежать непрофессионального вида!

Полезные материалы

  1. Аргументы командной строки в Python с помощью argparse – Real Python — Подробное руководство по работе с командной строкой в Python.
  2. Учебник по argparse — документация по Python 3.12.2 — Официальный учебник, помогающий освоить базовые возможности argparse.
  3. argparse — Parser for command-line options, arguments and sub-commands — Python 3.12.2 Documentation — Более подробное изучение всех тонкостей argparse, включая настройку текста справки.
  4. Как вставить новые строки в текст справки argparse? – Stack Overflow — Обсуждение о способах вставки символов разрыва строки в текст справки.
  5. Python Учебник – Argparse – YouTube — Видеоурок, помогающий новичкам быстро освоить основы argparse.
  6. Некоторые тонкости использования argparse · GitHub — Примеры форматирования текста справки при использовании argparse на Github.