Как я могу сделать разрыв строки (продолжение строки) в Python? - PullRequest
911 голосов
/ 10 сентября 2008

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

Например, добавив несколько строк,

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

и иметь его в две строки, как это:

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

Ответы [ 8 ]

1034 голосов
/ 10 сентября 2008

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

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

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

196 голосов
/ 10 сентября 2008

С Руководство по стилю для кода 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())

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

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

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

63 голосов
/ 15 сентября 2008

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

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

21 голосов
/ 21 сентября 2008

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

x = (tuples_first_value,
     second_value)
y = 1 + \
    2
21 голосов
/ 10 сентября 2008

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

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

или

b = (i1 < 20) and \
    (i2 < 30) and \
    (i3 < 40)
17 голосов
/ 10 сентября 2008

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

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

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

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

2 голосов
/ 02 ноября 2018

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

query = " ".join([
    'SELECT * FROM "TableName"',
    'WHERE "SomeColumn1"=VALUE',
    'ORDER BY "SomeColumn2"',
    'LIMIT 5;'
])
0 голосов
/ 06 декабря 2018

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

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

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

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

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

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