Форматирование длинных строк в Python: решение проблемы E501
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы придать длинным строкам в Python соответствие PEP8 и избежать ошибки E501, можно разбить их на отдельные части и обернуть их скобками для неявной конкатенации. Так к кода становится более удобным для чтения:
long_string = (
"Вот начало нашей истории, "
"Продолжение этой же истории, "
"А это заключительная часть великого произведения, соответствующего PEP8."
)
Также возможно использовать символ обратного слэша (\
) для продолжения строки, однако неявное объединение обычно выглядит аккуратнее:
long_string = "Та самая темная и бурная ночь, " \
"когда ветер вой вел в корнях деревьев."
Уходить еще рано, есть ещё способы работы с длинными строками, согласующиеся с PEP8!
Конкатенация строк: правило без +
При конкатенации строковых литералов в Python желательно избегать оператора +
, что улучшит читаемость кода:
# Это не лучший вариант
long_string = "Первое предложение, " + "второе предложение, " + "и третье предложение."
# Это рекомендуемый вариант
long_string = (
"Первое предложение, "
"второе предложение, "
"и третье предложение."
# И так можно продолжать...
)
Строки, располагающиеся рядом внутри скобок, автоматически сливаются в одну, делая их продолжение излишним.
Форматирование с пробелами и запятыми
Если требуется разделить строки запятыми и пробелами, лучше оставлять их в конце каждой строки — это значительно повышает удобство чтения и редактирования:
shopping_list = (
"Яблоки, " # Апле а дей кипс доктор эвей.
"Бананы, " # Кип калм энд ит бананас.
"Морковь." # Потому что почему бы и нет?
)
Скобки: их преимущества и подводные камни
Будьте осторожны при использовании скобок для разметки строк – случайно вы можете создать нежелательный кортеж. Важно внимательно следить за своим кодом:
# Появляется кортеж, вместо ожидаемой строки!
not_string = (
"Коты и ",
"Собаки!" # Срочно! Я не хотел создавать кортеж!
)
# Джоан ниже демонстрирует, как правильно форматировать строку
long_string = (
"Поздравляю, StackOverflow, "
"я точно не кортеж!"
)
Извините за длинную строку, E501
Иногда нарушение PEP8 неизбежно, например, когда вы включаете в свой код очень длинные строки по определенным причинам. В этих случаях можно отключить предупреждение E501, добавив комментарий # noqa: E501
:
long_url = 'http://www.example.com/incredibly/long/url/address/that/gives/everyone/a/headache' # noqa: E501
Это ваш спасательный круг в случае непреодолимых требований Полицейского Управления Кода.
Визуализация
Можно представить ограничение PEP 8 в 79 символов как книжную полку, на которую вы старательно ставите блоки текста:
Полка: |<---------------------------- 79 symbols ---------------------------->|
PEP 8 требует, чтобы ваши блоки (символы) не вылезали за границы Vашей полки (лимит символов).
Правильная разметка блоков по PEP 8 может выглядеть так:
train = (
"Я – просто строка, просто отдыхаю здесь, " # Без усилий
"И я тоже делаю то, что мне угодно, " # Без проблем
"Ну и мы отлично ладим вместе!" # Прекрасное соединение
)
Несмотря на то, что train
разделён, он остаётся единой, понятной длинной строкой.
Использование современных f-строк
Благодаря f-строкам можно динамически добавлять переменные в длинные строки, при этом сохраняя их читаемость и соответствие PEP8:
name = "Алиса"
occupation = "Разработчик"
greetings = (
f"Привет, меня зовут {name}, " # Добро пожаловать, Алиса
f"и я – {occupation}." # Интересная работа, Алиса
)
Сравнение: Читаемость против Соответствия
Порой читаемость имеет больший вес, чем строгое соблюдение PEP8 и его ограничения в 79 символов. Некоторые сведения, такие как URL или сообщения об ошибках, лучше оставить непереносимыми для лучшего восприятия. Не беспокойтесь, автоматические инструменты форматирования, например Black, умеют обрабатывать такие исключения.
Полезные материалы
- PEP 8 — Руководство по стилю кода Python: Максимальная длина строки: Ценное руководство для работы с длинными строками в Python.
- string — Основные операции со строками — Документация Python 3.12.2: Разнообразие подходов к работе со строками.
- PEP 498 — Литеральная интерполяция строк: Об удобстве f-строк и упрощении форматирования строк.
- Документация Black 24.2.0: Как Black автоматически форматирует Python-скрипты, чтобы они соответствовали PEP 8.