Як я можу розірвати цей довгий рядок у Python?


176

Як би ви вирішили форматувати довгий рядок, такий як цей? Я хотів би отримати його не більше 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
Здається, хороший варіант. Що вам не подобається в цьому?
Гаміш Грубіян

2
Трохи суб’єктивно, чи не так? :)
Адам Вось

1
пов'язані: stackoverflow.com/questions/1940710/… (конкатенація рядків у python)
jldupont

14
Ви можете зберегти персонаж, видаливши неправильне "в" це ".
jball

2
indexes: правильна множина indexє indices.
Scruffy

Відповіді:


336

Це початок. Не погана практика визначати довші рядки поза кодом, який їх використовує. Це спосіб розділити дані та поведінку. Ваш перший варіант полягає в тому, щоб об'єднати рядкові літерали разом, зробивши їх сусідніми один з одним:

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

У цьому є та сама проблема, що і в тій же методиці, що вище, оскільки правильний код відрізняється від неправильного коду невидимим пробілом.

Хто з них "найкращий", залежить від вашої конкретної ситуації, але відповідь не просто естетична, а одна з тонко різних форм поведінки.


26
Компілятор CPython максимально оптимізує операції з літералом, що означає, що додавання двох рядкових літералів призводить до лише одного рядкового літералу в байт-коді.
Ігнасіо Васкес-Абрамс

2
Хоча всі відповіді, які я отримав, корисні, ваша, безумовно, допомагає мені зрозуміти всі способи розбиття рядків. Чи закінчилася проблема з рядком "\", що після нього залишився пробіл?
Геттстер

1
Я не бачу різниці тут, але тоді, це здебільшого через досить примітивне синтаксичне забарвлення SO. (Деякі ідеально хороші коди практично не читаються на SO, але лише тому, що він не є мовою, синтаксис якої дуже близький до C.) Це не незвично, щоб ваш редактор неприємно виділяв пробіли, оскільки вони рідко корисні (або навмисні) . :-)
Кен

1
@KhurshidAlam ви можете використовувати одинарні лапки, 'щоб утримувати цей рядок, або уникати подвійних лапок всередині рядка або використовувати потрійні подвійні лапки """. Проблема з рядками, що котируються, містять лапки, однакова, чи використовуєте ви один рядок або кілька рядків для визначення прямого рядка.
hugovdberg

1
Мій редактор завжди видаляє пробіли пробілу завжди. Рекомендую ввімкнути ті самі налаштування. Звичайно, пробіл у новому рядку все ще є частиною рядка, тому я закінчив використовувати +.
ThaJay

46

Послідовні літеральні рядки приєднуються компілятором, і викладені в дужках вирази вважаються єдиним рядком коду:

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

11

Особисто мені не подобаються висячі відкриті блоки, тому я б форматував це як:

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

Взагалі я б не переймався надто важкими труднощами, щоб зробити код точно вписаним у рядок у 80 стовпців. Варто дотримати довжину лінії до розумних рівнів, але жорсткий межа 80 - це минуле.


8
Це насправді не минуле. Стандартна бібліотека Python досі використовує PEP8 в якості посібника зі стилів, тому правило все ще існує, і багато людей (включаючи мене) дотримуються його. Це зручне місце для малювання лінії.
Девін Жанп'єр

3
Цікаво, скільки проектів досі дотримуються правила 80 знаків. Для середнього розміру вікна, який я використовую, я вважаю, що 100-120 для мене більш продуктивний, ніж 80 символів.
Геттстер

1
Так, про довжину рядка я також використовую, хоча [жах! Holylege!] Я використовую пропорційний шрифт, тому точна довжина рядка не так важлива. Це скоріше справа про те, наскільки логіка в одному рядку читабельна, ніж скільки символів, як таких ... якщо у мене є довгий рядок даних, який нікому не потрібно читати, я радий дозволити йому пролитись 120.
bobince

Пропорційні шрифти для коду - я з тобою, брате. Судячи з неприємності, з ким я коли-небудь працював, для них світ не готовий.
jlarcombe

4
~ 80 символів також полегшують розмежування 2-х файлів поряд на одному екрані. Крім того, якщо ви налагоджуєте щось під час надзвичайної ситуації на консолі сервера, ви дійсно оціните обмеження 80 символів! :)
Мік Т

4

Ви можете використовувати модуль текстового обгортання, щоб розбити його на кілька рядків

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

ABCDEFGH
IJKLIMNO

З документації :

загортання тексту. wrap (text [, width [, ...]])
Обертає один абзац у тексті (рядку), щоб кожен рядок мав довжину не більше символів. Повертає список вихідних рядків без остаточних нових рядків.

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

TextWrapper.wrap()Додаткову інформацію про поведінку wrap () див. У методі.


2

Для тих, хто також намагається зателефонувати .format()на довгу нитку і не в змозі використовувати деякі найпопулярніші методи обгортання рядків, не порушуючи подальший .format(дзвінок, ви можете зробити це str.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))

Інакше єдиною можливістю є використання продовження рядків, що закінчуються, я особисто не є фанатом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.