Как написать очень длинную строку, которая соответствует 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.

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