Форматирование длинных строк в Python: решение проблемы E501

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

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

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

Чтобы придать длинным строкам в Python соответствие PEP8 и избежать ошибки E501, можно разбить их на отдельные части и обернуть их скобками для неявной конкатенации. Так к кода становится более удобным для чтения:

Python
Скопировать код
long_string = (
    "Вот начало нашей истории, "
    "Продолжение этой же истории, "
    "А это заключительная часть великого произведения, соответствующего PEP8."
)

Также возможно использовать символ обратного слэша (\) для продолжения строки, однако неявное объединение обычно выглядит аккуратнее:

Python
Скопировать код
long_string = "Та самая темная и бурная ночь, " \
              "когда ветер вой вел в корнях деревьев."

Уходить еще рано, есть ещё способы работы с длинными строками, согласующиеся с PEP8!

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

Конкатенация строк: правило без +

При конкатенации строковых литералов в Python желательно избегать оператора +, что улучшит читаемость кода:

Python
Скопировать код
# Это не лучший вариант
long_string = "Первое предложение, " + "второе предложение, " + "и третье предложение."

# Это рекомендуемый вариант
long_string = (
    "Первое предложение, "
    "второе предложение, "
    "и третье предложение."
    # И так можно продолжать...
)

Строки, располагающиеся рядом внутри скобок, автоматически сливаются в одну, делая их продолжение излишним.

Форматирование с пробелами и запятыми

Если требуется разделить строки запятыми и пробелами, лучше оставлять их в конце каждой строки — это значительно повышает удобство чтения и редактирования:

Python
Скопировать код
shopping_list = (
    "Яблоки, " # Апле а дей кипс доктор эвей.
    "Бананы, " # Кип калм энд ит бананас.
    "Морковь." # Потому что почему бы и нет?
)

Скобки: их преимущества и подводные камни

Будьте осторожны при использовании скобок для разметки строк – случайно вы можете создать нежелательный кортеж. Важно внимательно следить за своим кодом:

Python
Скопировать код
# Появляется кортеж, вместо ожидаемой строки!
not_string = (
    "Коты и ",
    "Собаки!" # Срочно! Я не хотел создавать кортеж!
)

# Джоан ниже демонстрирует, как правильно форматировать строку
long_string = (
    "Поздравляю, StackOverflow, "
    "я точно не кортеж!"
)

Извините за длинную строку, E501

Иногда нарушение PEP8 неизбежно, например, когда вы включаете в свой код очень длинные строки по определенным причинам. В этих случаях можно отключить предупреждение E501, добавив комментарий # noqa: E501:

Python
Скопировать код
long_url = 'http://www.example.com/incredibly/long/url/address/that/gives/everyone/a/headache'  # noqa: E501

Это ваш спасательный круг в случае непреодолимых требований Полицейского Управления Кода.

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

Можно представить ограничение PEP 8 в 79 символов как книжную полку, на которую вы старательно ставите блоки текста:

Markdown
Скопировать код
Полка:      |<---------------------------- 79 symbols ---------------------------->|

PEP 8 требует, чтобы ваши блоки (символы) не вылезали за границы Vашей полки (лимит символов).

Правильная разметка блоков по PEP 8 может выглядеть так:

Python
Скопировать код
train = (
    "Я – просто строка, просто отдыхаю здесь, "  # Без усилий
    "И я тоже делаю то, что мне угодно, "  # Без проблем
    "Ну и мы отлично ладим вместе!"          # Прекрасное соединение
)

Несмотря на то, что train разделён, он остаётся единой, понятной длинной строкой.

Использование современных f-строк

Благодаря f-строкам можно динамически добавлять переменные в длинные строки, при этом сохраняя их читаемость и соответствие PEP8:

Python
Скопировать код
name = "Алиса"
occupation = "Разработчик"
greetings = (
    f"Привет, меня зовут {name}, "  # Добро пожаловать, Алиса
    f"и я – {occupation}."    # Интересная работа, Алиса
)

Сравнение: Читаемость против Соответствия

Порой читаемость имеет больший вес, чем строгое соблюдение PEP8 и его ограничения в 79 символов. Некоторые сведения, такие как URL или сообщения об ошибках, лучше оставить непереносимыми для лучшего восприятия. Не беспокойтесь, автоматические инструменты форматирования, например Black, умеют обрабатывать такие исключения.

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

  1. PEP 8 — Руководство по стилю кода Python: Максимальная длина строки: Ценное руководство для работы с длинными строками в Python.
  2. string — Основные операции со строками — Документация Python 3.12.2: Разнообразие подходов к работе со строками.
  3. PEP 498 — Литеральная интерполяция строк: Об удобстве f-строк и упрощении форматирования строк.
  4. Документация Black 24.2.0: Как Black автоматически форматирует Python-скрипты, чтобы они соответствовали PEP 8.