Подтвердить что ты не робот

Правильный стиль для разрывов строк Python

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

# 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)
4b9b3361

Ответ 1

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

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

(Я изменил отступ, потому что мой редактор автоматически откладывает его.)

Я просто просмотрел PEP 8, и похоже, что нет упоминаний о разрывах строк. Но скобки (или другие символы, такие как [] или {}) должны помочь вашему редактору вставить код автоматически, и они требуют только изменить начало и конец выражения.

[изменить]

Вот что говорит об этом руководство по стилю благодаря delnan:

Предпочтительный способ обертывания длинных строк - это использование строки под названием 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)

[изменить]

Руководство по стилю теперь рекомендует разбивать перед двоичным оператором (спасибо @Neapolitan):

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

Ответ 2

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

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

...

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

"Пробел имеет важное значение в исходном коде Python".

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

Я надеюсь, что это поможет.

Ответ 5

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