Как я могу разбить эту длинную строку на 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))
В противном случае единственная возможность - использовать продолжения конца строки, которыми я лично не являюсь поклонником.