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