Как я могу разбить эту длинную строку в Python? - PullRequest
143 голосов
/ 13 января 2010

Как бы вы отформатировали длинную строку, такую ​​как эта? Я хотел бы получить ширину не более 80 символов:

logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes['url']], video.title))

Это мой лучший вариант?

url = "Skipping {0} because its thumbnail was already in our system as {1}."
logger.info(url.format(line[indexes['url']], video.title))

Ответы [ 4 ]

285 голосов
/ 13 января 2010

Это начало. Это неплохая практика - определять ваши более длинные строки вне кода, который их использует. Это способ отделить данные и поведение. Ваш первый вариант - неявно соединять строковые литералы, делая их смежными:

("This is the first line of my text, "
"which will be joined to a second.")

Или с продолжением конца строки, которое немного более хрупко, так как это работает:

"This is the first line of my text, " \
"which will be joined to a second."

Но это не так:

"This is the first line of my text, " \ 
"which will be joined to a second."

Видишь разницу? Нет? Ну, вы не будете, когда это ваш код тоже.

Недостатком неявного объединения является то, что оно работает только со строковыми литералами, а не со строками, взятыми из переменные, поэтому вещи могут стать немного более волосатым, когда вы рефакторинг. Кроме того, вы можете интерполировать только форматирование объединенной строки в целом.

Кроме того, вы можете присоединиться явно, используя оператор конкатенации (+):

("This is the first line of my text, " + 
"which will be joined to a second.")

Явное лучше, чем неявное, как говорит дзен Python, но это создает три строки вместо одной и использует вдвое больше памяти: есть две написанные вами, плюс одна, которая является двумя, соединенными вместе так что вы должны знать, когда игнорировать дзен. Плюс вы можете применить форматирование к любая из подстрок отдельно в каждой строке или для всей партии вне скобок.

Наконец, вы можете использовать строки в тройных кавычках:

"""This is the first line of my text
which will be joined to a second."""

Это часто мой любимый, хотя его поведение немного отличается, так как перевод строки и любые пробелы в последующих строках будут отображаться в вашей последней строке. Вы можете устранить символ новой строки с помощью обратной косой черты.

"""This is the first line of my text \
which will be joined to a second."""

Это та же проблема, что и та же техника, описанная выше, в том, что правильный код отличается от неправильного кода только невидимым пробелом.

Какой из них «лучший», зависит от вашей конкретной ситуации, но ответ не просто эстетический, но один из слегка отличающихся поведений.

36 голосов
/ 13 января 2010

Последовательные строковые литералы объединяются компилятором, а выражения в скобках считаются одной строкой кода:

logger.info("Skipping {0} because it's thumbnail was "
  "already in our system as {1}.".format(line[indexes['url']],
  video.title))
10 голосов
/ 13 января 2010

Лично мне не нравится вешать открытые блоки, поэтому я отформатировал бы это:

logger.info(
    'Skipping {0} because its thumbnail was already in our system as {1}.'
    .format(line[indexes['url']], video.title)
)

В общем, я бы не стал слишком усердно бороться, чтобы код вписался точно в строку из 80 столбцов. Стоит сократить длину линии до разумных уровней, но жесткий предел 80 остается в прошлом.

3 голосов
/ 07 апреля 2018

Вы можете использовать модуль textwrap, чтобы разбить его на несколько строк

import textwrap
str="ABCDEFGHIJKLIMNO"
print("\n".join(textwrap.wrap(str,8)))

ABCDEFGH
IJKLIMNO

Из документации :

textwrap. wrap (текст [, ширина [, ...]])
Переносит один абзац в текст (строку), поэтому длина каждой строки не должна превышать ширину. Возвращает список выходных строк без заключительных символов новой строки.

Необязательные аргументы ключевых слов соответствуют атрибутам экземпляра TextWrapper, описанным ниже. ширина по умолчанию 70.

См. Метод TextWrapper.wrap() для получения дополнительной информации о том, как ведет себя wrap ().

...