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

8 ответов:

неявная конкатенация может быть самым чистым решением:

s = "this is my really, really, really, really, really, really," \
    " really long string that I'd like to shorten."

Edit по размышлении я согласен, что предложение Тодда использовать скобки, а не продолжение строки, лучше по всем причинам, которые он дает. Единственное колебание, которое у меня есть, это то, что относительно легко спутать строки в скобках с кортежами.

кроме того, поскольку соседние строковые константы автоматически объединяются, вы можете закодировать его следующим образом:

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 line length", который возвращает ссылку PEP8 в качестве первого результата, но также ссылки на другой хороший пост StackOverflow по этой теме:"почему Python PEP-8 должен указывать максимальную строку длину 79 символов?"

еще одна хорошая поисковая фраза будет "продолжение линии python".

Я думаю, что самым важным словом в вашем вопросе было "предлагает".

стандарты кодирования-это забавные вещи. Часто руководство, которое они предоставляют, имеет действительно хорошую основу, когда оно было написано (например, большинство терминалов не могут показывать > 80 символов в строке), но со временем они становятся функционально устаревшими, но все еще жестко придерживаются. Я думаю, что вам нужно сделать здесь, чтобы взвесить относительные достоинства "сломать" это конкретное предложение против удобочитаемости и mainatinability вашего кода.

извините, это не дает прямого ответа на ваш вопрос.

вы потеряли места, и вам, вероятно, нужен символ продолжения строки, т. е. а \.

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

обратная косая черта:

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

должны работать.

Я обычно использую несколько методов, не упомянутых здесь для указания больших строк, но они предназначены для очень конкретных сценариев. МММ...

  • многострочные капли текста, часто с форматированными маркерами (не совсем то, что вы просили, но все же полезно):

    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 не делает ограничьте длину строк в файле; только строки вашего кода. :)

  • используйте грубую силу или ваш редактор, чтобы разделить строку на управляемые строки с помощью новых строк, а затем удалить все новые строки. (Аналогично первому методу, который я перечислил):

    foo = '''
    agreatbigstringthatyoudonotwanttohaveanyne
    wlinesinbutforsomereasonyouneedtospecifyit
    verbatimintheactualcodejustlikethis
    '''.replace('\n', '')
    

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

пример кода (где обрезка должна избавиться от первого '\n ' с кусочком):

import textwrap as tw
x = """
       This is a yet another test.
       This is only a test"""
print(tw.dedent(x[1:]))

объяснение:

из того, что я могу сказать, dedent вычисляет отступ на основе пробела в первой строке текста перед новой строкой. Поэтому я добавил новую строку, чтобы было проще выстраиваться код. Чтобы избежать новой строки, вам придется добавить в первую строку текста дополнительное пустое пространство, чтобы последующие строки уменьшали отступы по вашему желанию. Если вы хотите настроить его, вы можете легко переопределить его с помощью re модуль.

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