Как я могу разбить эту длинную строку на Python?

Как вы собираетесь форматировать длинную строку, например? Я хотел бы получить его шириной не более 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))

Ответ 1

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

("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.")

Явный лучше, чем неявный, как говорит zen 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."""

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

Какой из них "лучший" зависит от вашей конкретной ситуации, но ответ не просто эстетический, а одно из тонко разных поведений.

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

ABCDEFGH
IJKLIMNO

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

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

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

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

Ответ 5

Для тех, кто также пытается вызвать .format() для длинной строки и не может использовать некоторые из самых популярных методов переноса строк, не нарушая последующий .format( вызов, вы можете выполнить str.format("", 1, 2) вместо "".format(1, 2). Это позволяет разорвать строку любым "".format(1, 2). Например:

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

может быть

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

В противном случае единственная возможность - использовать продолжения конца строки, которыми я лично не являюсь поклонником.