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

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

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

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

и введите его в две строки:

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

Ответ 1

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

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

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

if a == True and \
   b == False

Подробнее о руководстве по стилю.

В строке вашего примера:

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

Или:

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

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

Ответ 2

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

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

Обратные слеши могут все еще быть подходящими время от времени. Например, длинные множественные операторы with не могут использовать неявное продолжение, поэтому допустимы обратные слеши:

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())

Еще один такой случай - с утверждениями об утверждении.

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

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: должен ли разрыв строки до или после двоичного оператора?:

Дональд Кнут объясняет традиционное правило в своей серии "Компьютеры и набор текста": "Хотя формулы внутри абзаца всегда ломаются после двоичных операций и отношений, отображаемые формулы всегда ломаются перед двоичными операциями" [3].

Следуя традиции математики, обычно получается более читаемый код:

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

В коде Python допускается разрыв до или после двоичного оператора, если соглашение согласовано локально. Для нового кода предлагается стиль Кнута.

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

Ответ 3

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

См. Идиомы и анти-идиомы Python (для Python 2 или Python 3) для более.

Ответ 4

Поместите a \ в конец строки или заключите оператор в parens ( .. ). Из IBM:

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

или

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

Ответ 5

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

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

Ответ 6

Из устья лошади: Явная строка присоединение

Две или более физических линий могут быть соединяются в логические линии, используя символы обратной косой черты (\), а именно: когда физическая линия заканчивается обратная косая черта, которая не является частью строки литерал или комментарий, он соединен с следующее формирование единого логического линии, удаляя обратную косую черту и после символа конца строки. Для Пример:

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

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

Ответ 7

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

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

Ответ 8

Взято из Руководства автостопщика по Python (продолжение строки):

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

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

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

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

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