Правильный стиль для разрывов строк при объединении методов в Python - PullRequest
40 голосов
/ 30 октября 2011

У меня есть такой код.Должен ли перерыв произойти до или после периода?

# before
my_var = somethinglikethis.where(we=do_things).where(we=domore).where(we=everdomore)

# this way
my_var = somethinglikethis.where(we=do_things) \
                          .where(we=domore) \
                          .where(we=everdomore)

# or this way
my_var = somethinglikethis.where(we=do_things). \
                           where(we=domore). \
                           where(we=everdomore)

Ответы [ 5 ]

61 голосов
/ 30 октября 2011

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

my_var = (somethinglikethis
          .where(we=do_things)
          .where(we=domore)
          .where(we=everdomore))

Это два соответствующих отрывка из раздела Максимальная длина строки :

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

... и всего Разрыв строки до или после двоичного оператора? section:

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

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

# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

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

Следуя традициииз математики обычно приводит к более читабельному коду:

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

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

Обратите внимание, что, как указано в приведенной выше цитате, PEP 8 использовал , чтобы дать противоположный совет о том, где обойти оператор, цитируемыйниже для потомков:

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

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)
4 голосов
/ 09 мая 2016

PEP 8 говорит, что предпочтительнее прерывание перед оператором:

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

...

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

https://www.python.org/dev/peps/pep-0008/#should-a-line-break-before-or-after-a-binary-operator

2 голосов
/ 18 февраля 2014

FWIW, autopep8 (с флагом --aggressive) произвели это из вашего исходного кода:

my_var = somethinglikethis.where(
    we=do_things).where(
    we=domore).where(
    we=everdomore)

Но я согласен - решение Бастьена более элегантно.

1 голос
/ 30 октября 2011

Делай, что работает.

Кроме того, ознакомьтесь с этой статьей о мифах об отступах в Python. Это можно найти здесь .

Начинается с:

«Пробелы значимы в исходном коде Python.»

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

Надеюсь, это поможет.

0 голосов
/ 30 октября 2011

Там действительно нет никаких неправильных путей. Все перечисленные вами будут работать одинаково.

...