Как написать очень длинную строку, которая соответствует PEP8 и предотвратить E501
Поскольку PEP8 предлагает оставить ниже правила столбца 80 для вашей программы python, как я могу придерживаться этого с длинными строками, т.е.
s = "this is my really, really, really, really, really, really, really long string that I'd like to shorten."
Как я могу расширить его до следующей строки, т.е.
s = "this is my really, really, really, really, really, really" +
"really long string that I'd like to shorten."
Ответы
Ответ 1
Неявное конкатенация может быть самым чистым решением:
s = "this is my really, really, really, really, really, really," \
" really long string that I'd like to shorten."
Изменить. При отражении я согласен с тем, что предложение Тодда использовать скобки вместо продолжения строки лучше по всем причинам, которые он дает. Единственное колебание, которое у меня есть, это то, что относительно легко путать строки в скобках с кортежами.
Ответ 2
Кроме того, поскольку соседние строковые константы автоматически объединены, вы также можете закодировать его так:
s = ("this is my really, really, really, really, really, really, "
"really long string that I'd like to shorten.")
Обратите внимание на знак плюса, и я добавил дополнительную запятую и пробел, которые следует за форматированием вашего примера.
Лично мне не нравятся обратные косые черты, и я помню, где-то читал, что его использование на самом деле не рекомендуется в пользу этой формы, которая более ясна. Помните: "Явное лучше, чем неявное".
Я считаю обратную косую черту менее ясной и менее полезной, потому что это фактически ускользает от символа новой строки. Невозможно поместить комментарий конца строки после него, если необходимо. Это можно сделать с помощью конкатенированных строковых констант:
s = ("this is my really, really, really, really, really, really, " # comments ok
"really long string that I'd like to shorten.")
Я использовал поиск в Google "длина строки python", который возвращает ссылку PEP8 в качестве первого результата, но также ссылается на другой хороший пост StackOverflow в этом разделе: "Почему Python PEP-8 указывает максимальную длину строки в 79 символов?"
Другая хорошая поисковая фраза будет "продолжение строки питона".
Ответ 3
Я думаю, что самым важным словом в вашем вопросе было "предложение".
Стандарты кодирования - забавные вещи. Часто руководство, которое они предоставляют, имеет действительно хорошую основу, когда оно было написано (например, большинство терминалов не могут отображать > 80 символов на линии), но со временем они становятся функционально устаревшими, но все еще жестко соблюдаются. Я предполагаю, что вам нужно сделать здесь, взвешивание относительных достоинств "взлома" этого конкретного предложения против читаемости и гласности вашего кода.
Извините, это прямо не отвечает на ваш вопрос.
Ответ 4
Вы потеряли пространство, и вам, вероятно, понадобится символ продолжения строки, т.е. a \
.
s = "this is my really, really, really, really, really, really" + \
" really long string that I'd like to shorten."
или даже:
s = "this is my really, really, really, really, really, really" \
" really long string that I'd like to shorten."
Parens также работал бы вместо продолжения линии, но вы рискуете, что кто-то подумает, что вы намереваетесь иметь кортеж и только что забыли запятую. Возьмем, к примеру:
s = ("this is my really, really, really, really, really, really"
" really long string that I'd like to shorten.")
против
s = ("this is my really, really, really, really, really, really",
" really long string that I'd like to shorten.")
С динамической типизацией Python код может работать в любом случае, но приводит к неправильным результатам с тем, который вы не планировали.
Ответ 5
Backslash:
s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."
или обернуть в parens:
s = ("this is my really, really, really, really, really, really" +
"really long string that I'd like to shorten.")
Ответ 6
С помощью \
вы можете развернуть операторы на несколько строк:
s = "this is my really, really, really, really, really, really" + \
"really long string that I'd like to shorten."
должен работать.
Ответ 7
Все это отличные ответы, но я не смог найти плагин редактора, который бы помог мне с редактированием "неявно сцепленных" строк, поэтому я написал пакет, чтобы мне было проще.
На pip (установите параграфы), если кто-нибудь, блуждающий по этой старой теме, захочет проверить это. Форматирует многострочные строки, как это делает html (сжимает пробел, две строки для нового абзаца, не заботясь о пробелах между строками).
from paragraphs import par
class SuddenDeathError(Exception):
def __init__(self, cause: str) -> None:
self.cause = cause
def __str__(self):
par(
f"""
Y - e - e - e - es, Lord love you! Why should she die of
influenza? She come through diphtheria right enough the year
before. I saw her with my own eyes. Fairly blue with it, she was.They
all thought she was dead; but my father he kept ladling gin down
her throat til she came to so sudden that she bit the bowl off the
spoon.
What call would a woman with that strength in her have to die of
influenze? What become of her new straw hat that should have
come to me? Somebody pinched it; and what I say is, them as pinched
it done her in."""
)
становится...
Y - e - e - e - es, Lord love you! Why should she die of influenza? She come through...
What call would a woman with that strength in her have to die of influenza? What...
Все легко выстраивается с (Vim) 'gq'
Ответ 8
Доступные варианты:
- обратная косая черта:
"foo" \ "bar"
- знак плюс, за которым следует обратная косая черта:
"foo" + \ "bar"
- Кронштейны:
("foo" "bar")
- скобки со знаком плюс plus sign:
("foo" + "bar")
- PEP8, E502: обратный слеш избыточен в скобках
Избегайте
Избегайте скобок с запятой: ("foo", "bar")
, которая определяет кортеж.
>>> s = "a" \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = "a" + \
... "b"
>>> s
'ab'
>>> type(s)
<class 'str'>
>>> s = ("a"
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>> s = ("a",
... "b")
>>> type(s)
<class 'tuple'>
>>> s = ("a" +
... "b")
>>> type(s)
<class 'str'>
>>> print(s)
ab
>>>
Ответ 9
Я склонен использовать несколько методов, не упомянутых здесь, для указания больших строк, но они предназначены для очень специфических сценариев. YMMV...
-
Многострочные фрагменты текста, часто с отформатированными токенами (не совсем то, что вы просили, но все же полезно):
error_message = '''
I generally like to see how my helpful, sometimes multi-line error
messages will look against the left border.
'''.strip()
-
Выращивайте переменную по частям с помощью любого метода интерполяции строк, который вы предпочитаете:
var = 'This is the start of a very,'
var = f'{var} very long string which could'
var = f'{var} contain a ridiculous number'
var = f'{var} of words.'
-
Прочитайте это из файла. PEP-8 не ограничивает длину строк в файле; только строки вашего кода. :)
-
Используйте brute-force или ваш редактор, чтобы разбить строку на управляемые строки, используя новые строки, а затем удалите все новые строки. (Аналогично первой технике, которую я перечислил):
foo = '''
agreatbigstringthatyoudonotwanttohaveanyne
wlinesinbutforsomereasonyouneedtospecifyit
verbatimintheactualcodejustlikethis
'''.replace('\n', '')
Ответ 10
Я использовал textwrap.dedent в прошлом. Это немного громоздко, поэтому я предпочитаю продолжение строки сейчас, но если вы действительно хотите отступ блока, я думаю, что это здорово.
Пример кода (где обрезка избавляет от первого '\n' срезом):
import textwrap as tw
x = """
This is a yet another test.
This is only a test"""
print(tw.dedent(x[1:]))
Объяснение:
Из того, что я могу сказать, dedent вычисляет отступ на основе пробела в первой строке текста перед новой строкой. Поэтому я добавил новую строку, чтобы упростить выравнивание кода. Чтобы избежать перехода на новую строку, вам необходимо добавить в первую строку текста дополнительный пробел, чтобы отступы последующих строк уменьшались по вашему желанию. Если вы хотите настроить его, вы можете легко переопределить его, используя модуль re
.
Этот метод имеет ограничения в том, что очень длинные строки будут длиннее, чем вы хотите, и в этом случае другие методы, которые объединяют строки, являются более подходящими.