Вставка переносов строки в текст справки argparse Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для того чтобы добавить символы разрыва строки (\n
) в текст помощи вашего парсера argparse.ArgumentParser
, используйте класс RawTextHelpFormatter
:
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
.
Пользовательский форматтер для выборчного форматирования
Если вам нужно ограничить использование символов разрыва строк, вы можете воспользоваться SmartFormatter
. Это пользовательский форматтер, который позволяет управлять форматированием:
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
. Это позволит устранить висячие отступы и сделать текст более читаемым:
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()
Такой подход позволит сделать каждую строку отдельным и читаемым блоком.
Визуализация
Представьте себе, что вы создаете подробную инструкцию:
📘 Инструкция:
- Завести двигатель [Нажать кнопку 'Старт']
- Использовать навигатор [Ввести место назначения]
Если вы не добавляете разрывы строк, вся информация склеивается в единый блок текста:
🧱📄: Завести двигатель, нажав кнопку 'Старт', ввести адрес в навигатор...
Вставляя новые строки, вы упорядочиваете информацию по отдельным блокам, аналогично расставленному товару на полках магазина:
🔲 Запуск двигателя 🔳 Использование навигации
├─ Нажать кнопку 'Старт' ├─ Ввести место назначения
└─ (Всё остается на своих местах) └─ (Информация четко разделена)
От вас зависит, на что будет походить ваш текст: на инструкцию от IKEA или на хорошо структурированный код.
Управляйте своим текстом
Если вам нужно сохранить исходное форматирование текста, примените следующий однострочный пользовательский форматтер:
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()
Такой подход позволяет сохранить первоначальное формирование всех строк.
Тонкости и потенциальные проблемы
Создание собственных форматтеров может решить сложные задачи, например, форматирование многострочных блоков кода или цитат. Однако будьте осторожны с длинными строками: из-за ограничения ширины терминала текст справки может стать нечитабельным. Тестируйте свой скрипт на различных размерах экрана, чтобы избежать непрофессионального вида!
Полезные материалы
- Аргументы командной строки в Python с помощью argparse – Real Python — Подробное руководство по работе с командной строкой в Python.
- Учебник по argparse — документация по Python 3.12.2 — Официальный учебник, помогающий освоить базовые возможности argparse.
- argparse — Parser for command-line options, arguments and sub-commands — Python 3.12.2 Documentation — Более подробное изучение всех тонкостей argparse, включая настройку текста справки.
- Как вставить новые строки в текст справки argparse? – Stack Overflow — Обсуждение о способах вставки символов разрыва строки в текст справки.
- Python Учебник – Argparse – YouTube — Видеоурок, помогающий новичкам быстро освоить основы argparse.
- Некоторые тонкости использования argparse · GitHub — Примеры форматирования текста справки при использовании argparse на Github.