Отступы Python в «пустых строках» - PullRequest
39 голосов
/ 28 апреля 2010

Что предпочтительнее («.» Указывает на пробел)?

A)

def foo():
    x = 1
    y = 2
....
    if True:
        bar()

В)

def foo():
    x = 1
    y = 2

    if True:
        bar()

Моей интуицией была бы B (это также то, что vim делает для меня), но я вижу людей, использующих A) все время. Это только потому, что большинство редакторов там сломаны?

Ответы [ 9 ]

33 голосов
/ 28 апреля 2010

Если вы используете A , вы можете скопировать вставить свой блок в оболочку Python, B получит неожиданную ошибку отступа.

23 голосов
/ 28 апреля 2010

PEP 8 , по-видимому, не совсем ясен в этом вопросе, хотя утверждения о «пустых строках» можно интерпретировать в пользу B. Средство проверки стиля PEP 8 (pep8.py) предпочитает B и предупреждает, если вы используете A; однако оба варианта законны. Мое собственное мнение таково, что, поскольку Python будет успешно интерпретировать код в любом случае, это на самом деле не имеет значения, и попытка обеспечить его выполнение будет большой работой при очень небольшом выигрыше. Я полагаю, если вы очень непреклонны в пользу одного или другого, вы можете автоматически преобразовать одно в другое. Попытка исправить все такие линии вручную, однако, была бы огромным трудом и действительно не стоила усилий, ИМХО.

12 голосов
/ 28 апреля 2010

Эта пустая строка принадлежит foo(), поэтому я считаю A наиболее естественным. Но я думаю, это просто вопрос мнения.

11 голосов
/ 28 июля 2014

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

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

Сравните, прочитав следующее:

A)

def foo():
....x = 1
....y = 2
....
....if True:
........bar()

В)

def foo():
....x = 1
....y = 2

....if True:
........bar()

В A гораздо понятнее, что две последние строки являются частью foo. Это еще более полезно при более высоких уровнях отступов.

6 голосов
/ 28 апреля 2010

TextMate прерывает свертывание блоков, если вы используете B, и я все равно предпочитаю A, так как это более «логично».

3 голосов
/ 28 апреля 2010

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

Это вопрос кодирования этикета.

3 голосов
/ 28 апреля 2010

Я бы не стал называть первый пример «сломанным», потому что я знаю, что некоторые люди ненавидят его, когда курсор «перепрыгивает назад» при перемещении курсора вверх или вниз в коде. Например. Visual Studio (по крайней мере, 2008) автоматически предотвращает это без использования пробельных символов в этих строках.

1 голос
/ 28 апреля 2010

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

0 голосов
/ 06 июля 2017

vi неявно препятствует поведению в A, поскольку навигация { / } больше не работает, как ожидалось. git явно препятствует этому, выделяя его красным при запуске git diff. Я бы также сказал, что если строка содержит пробелы, это не пустая строка.

По этой причине я настоятельно предпочитаю B. Нет ничего хуже, чем ожидать пропустить шесть или около того строк с движением { и оказаться на вершине класса def.

...