Как я могу сделать разрыв строки (продолжение строки) в Python?

У меня есть длинная строка кода, которую я хочу разбить на несколько строк. Что я использую и каков синтаксис?

Например, добавив кучу строк,

e = 'a' + 'b' + 'c' + 'd'

и поместите его в две строчки вот так:

e = 'a' + 'b' +
    'c' + 'd'
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1 173
0
1 824 316
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Поместите \ в конец вашей строки или заключите оператор в скобки ( .. ). От IBM:

b = ((i1 < 20) and
     (i2 < 30) and
     (i3 < 40))

или же

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
Ответ принят как подходящий

Что это за линия? Вы можете просто указать аргументы в следующей строке без каких-либо проблем:

a = dostuff(blahblah1, blahblah2, blahblah3, blahblah4, blahblah5, 
            blahblah6, blahblah7)

В противном случае вы можете сделать что-то вроде этого:

if (a == True and
    b == False):

или с явным разрывом строки:

if a == True and \
   b == False:

Проверьте гид по стилю для получения дополнительной информации.

Используя круглые скобки, ваш пример может быть записан в несколько строк:

a = ('1' + '2' + '3' +
    '4' + '5')

Тот же эффект можно получить, используя явный разрыв строки:

a = '1' + '2' + '3' + \
    '4' + '5'

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

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

Carl Meyer 11.09.2008 23:00

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

Harley Holcombe 12.09.2008 02:59

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

Carl Meyer 21.09.2008 22:26

Карл: Я не согласен, это из руководства: предпочтительный способ обертывания длинных строк - использование подразумеваемого продолжения строки Python внутри круглых скобок, скобок и фигурных скобок. При необходимости вы можете добавить дополнительную пару круглых скобок вокруг выражения, но иногда лучше использовать обратную косую черту.

Jerub 22.09.2008 06:33

Джеруб: Вы не согласны с Карлом, но цитируете руководство, в котором говорится, что «Предпочтительный способ… - использовать подразумеваемое продолжение строки Python в круглых скобках…». Значит, вы либо не согласны с Харли, либо потеряли смысл вставленной вами цитаты.

tzot 10.10.2008 04:57

Дело в том, что в этом случае нужны круглые скобки нет. Конечно, вы можете их получить, но зачем вы помещаете их в пример в вопросе? В любом случае, я немного отредактирую свой ответ, чтобы уточнить.

Harley Holcombe 10.10.2008 05:08

Ключевая часть цитаты из руководства по стилю: «При необходимости вы можете добавить дополнительную пару круглых скобок вокруг выражения, но иногда лучше использовать обратную косую черту». В руководстве по стилю нет говорится, что вы должны заключить в круглые скобки Добавить, это оставляет это на усмотрение автора.

Tony Meyer 14.11.2008 01:49

Предположительно, PEP-8 изменился с тех пор, как были добавлены эти комментарии, поскольку теперь довольно ясно, что для обертывания длинных строк следует добавлять круглые скобки: «Длинные строки можно разбить на несколько строк, заключив выражения в круглые скобки».

Daniel 08.02.2012 13:04

@HarleyHolcombe Я читал это, поскольку допустимо добавлять круглые скобки, чтобы обернуть длинные строки; если бы в выражениях уже были круглые скобки, не было бы необходимости заключать их в оболочку. Однако это определенно не на 100% ясно, и я не буду спорить по поводу интерпретации. Решающим фактором для меня является то, что я думаю, так это выглядит лучше :).

Daniel 09.02.2012 04:54

PEP8 действительно изменился в 2010 году - исчезло выражение «иногда использование обратной косой черты выглядит лучше».

e100 18.03.2012 22:31

@ e100 «Обратные косые черты иногда могут быть уместны». сейчас там в 2014 году. Не знаю, пропал ли он, а затем вернулся или просто переехал.

matt wilkie 09.10.2014 20:34

Не очень важно, но поскольку это python, я бы рекомендовал использовать (spam + eggs + foo + bar + moreSpam + moreEggs), потому что в python спам и яйца являются традиционными.

tox123 25.10.2014 05:12

Итак, если вы цепляетесь, вы должны использовать скобки вокруг цепочек разрыва строки? я очень разочарован питоном, исходящим из c, C++, C# и javascript. Это не так просто, как я ожидал, потому что пробелы имеют значение, думая, что это меньше, значит больше, но они меня поймали.

Jason Sebring 17.10.2015 03:57

Что делать с ans['Interfaces Declared by Environment'][env_.name][interface_] = None? Эта строка слишком длинная, но я не знаю, где ее разделить!

nerdoc 21.01.2016 19:00

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

Darren Ringer 03.08.2016 22:25

Преимущество версии в скобках: вы можете ставить комментарии после разрыва строки. Я часто использую многострочные операторы, чтобы разбить одно выражение на части и прокомментировать каждую часть. Не могу этого сделать с обратной косой чертой.

Peter 24.02.2017 21:03

Очевидно, очень сбивает с толку в конкретном случае использования конкатенации строк +, нормальный висячий отступ не работает ... вы ДОЛЖНЫ (?) Заключить все это в скобки. Например: 1: a = 'this ' + does +2: ' not ' + work должен быть записан как 1: a = ('this ' + does +2: ' work ' + fine). Боже

user9645 27.10.2020 18:15

From the horse's mouth: Explicit line joining

Two or more physical lines may be joined into logical lines using backslash characters (\), as follows: when a physical line ends in a backslash that is not part of a string literal or comment, it is joined with the following forming a single logical line, deleting the backslash and the following end-of-line character. For example:

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # Looks like a valid date
        return 1

A line ending in a backslash cannot carry a comment. A backslash does not continue a comment. A backslash does not continue a token except for string literals (i.e., tokens other than string literals cannot be split across physical lines using a backslash). A backslash is illegal elsewhere on a line outside a string literal.

-1, потому что пример является унидиоматическим ИМО. Сложные условные выражения могут иметь вместо этого заключающие скобки, что более практично (для редактирования или автоматического переноса) и идиоматично.

u0b34a0f6ae 08.12.2009 21:18

От PEP 8 - Руководство по стилю для кода Python:

The preferred way of wrapping long lines is by using Python's implied line continuation inside parentheses, brackets and braces. Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.

Backslashes may still be appropriate at times. For example, long, multiple with-statements cannot use implicit continuation, so backslashes are acceptable:

with open('/path/to/some/file/you/want/to/read') as file_1, \
        open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Another such case is with assert statements.

Make sure to indent the continued line appropriately. The preferred place to break around a binary operator is after the operator, not before it. Some examples:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
                color == 'red' and emphasis == 'strong' or
                highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)

PEP8 теперь рекомендует противоположное соглашение (для взлома бинарных операций), используемый математиками и их издателями для улучшения читаемости.

Стиль Дональда Кнута, нарушающий перед бинарного оператора, выравнивает операторы по вертикали, тем самым уменьшая нагрузку на глаза при определении того, какие элементы добавляются и вычитаются.

От PEP8: Должна ли строка разрываться до или после бинарного оператора?:

Donald Knuth explains the traditional rule in his Computers and Typesetting series: "Although formulas within a paragraph always break after binary operations and relations, displayed formulas always break before binary operations"[3].

Following the tradition from mathematics usually results in more readable code:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

In Python code, it is permissible to break before or after a binary operator, as long as the convention is consistent locally. For new code Knuth's style is suggested.

[3]: TeXBook Дональда Кнута, страницы 195 и 196.

NB рекомендация изменилась в 2010 году: «Длинные строки можно разорвать ... заключая выражения в круглые скобки. Их следует использовать вместо использования обратной косой черты ...», и все обратные косые черты были удалены из примера кода.

e100 18.03.2012 00:33

@ e100: прочтите текст, выделенный жирным шрифтом выше: The preferred way .. is by using Python's implied line continuation inside parentheses это то же самое, что и by wrapping expressions in parentheses. Я обновил пример

jfs 18.03.2012 01:23

Но обратите внимание, что «иногда использование обратной косой черты выглядит лучше» тоже исчезло.

e100 18.03.2012 04:04

@ e100: здесь трикодПримеры, где обратная косая черта делает код более читаемым: «иногда руководство по стилю просто неприменимо. Если сомневаетесь, руководствуйтесь здравым смыслом».

jfs 23.10.2014 07:27

В 2015 году руководство по стилю было обновлено, чтобы фактически предпочесть нарушение бинарных операторов перед после исследования Дональд Кнут из-за предполагаемых улучшений в удобочитаемости.

J2C 08.07.2016 14:04

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

См. Python Idioms and Anti-Idioms (для Python 2 или Python 3) для получения дополнительной информации.

Это одна из причин, по которой приятно видеть конечные пробелы; то есть что-то вроде set list listchars=trail:· в vim. :)

Beau 01.02.2011 22:07

Между скобками и фигурными скобками можно разрывать строки. Кроме того, вы можете добавить в строку символ обратной косой черты \, чтобы явно разорвать ее:

x = (tuples_first_value,
     second_value)
y = 1 + \
    2

Возможно, это не метод Pythonic, но я обычно использую список с функцией соединения для записи длинной строки, например SQL-запросов:

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])

Присоединение к списку не обязательно и требует дополнительных затрат на производительность. Используйте строковый литерал в тройных кавычках

OneCricketeer 11.02.2021 02:43

Взято из Автостопом по Python (Продолжение линии):

When a logical line of code is longer than the accepted limit, you need to split it over multiple physical lines. The Python interpreter will join consecutive lines if the last character of the line is a backslash. This is helpful in some cases, but should usually be avoided because of its fragility: a white space added to the end of the line, after the backslash, will break the code and may have unexpected results.

A better solution is to use parentheses around your elements. Left with an unclosed parenthesis on an end-of-line the Python interpreter will join the next line until the parentheses are closed. The same behaviour holds for curly and square braces.

However, more often than not, having to split a long logical line is a sign that you are trying to do too many things at the same time, which may hinder readability.

При этом, вот пример, рассматривающий множественный импорт (при превышении ограничения линии, определенные на PEP-8), также применяемый к строкам в целом:

from app import (
    app, abort, make_response, redirect, render_template, request, session
)

Если вы хотите разбить строку из-за длинной буквальной строки, вы можете разбить эту строку на части:

long_string = "a very long string"
print("a very long string")

будет заменен на

long_string = (
  "a "
  "very "
  "long "
  "string"
)
print(
  "a "
  "very "
  "long "
  "string"
)

Вывод для обоих операторов печати:

a very long string

Обратите внимание на круглые скобки в аффектации.

Также обратите внимание, что разбиение буквальных строк на части позволяет использовать буквальный префикс только в частях строки и смешивать разделители:

s = (
  '''2+2='''
  f"{2+2}"
)

Также можно разбить вызов методов (obj.method()) на несколько строк.

Заключите команду в скобки «()» и растяните на несколько строк:

> res = (some_object
         .apply(args)
         .filter()
         .values)

Например, я считаю полезным вызывать методы объектов Pandas / Holoviews по цепочке.

Другие вопросы по теме