Дополнительные пробелы для выравнивания строк продолжения

Я начал использовать Flake8 для проверки своего кода на Python, но одна ошибка/предупреждение, которую он всегда выдает мне, которую мне сложно сортировать, - это «строка продолжения с отступом сверху/слишком».

Flake8 хочет, чтобы моя линия продолжения точно совпадала с начальной скобкой. Итак, в приведенном ниже примере Flake8 не понравятся первые два, но понравится третий: (» = 4 пробела, · = один пробел)

let_us_pass.some_function(with_a_lot_of=['strings'], or_other_arguments,
»   »   »   »   »   »   and_another)

let_us_pass.some_function(with_a_lot_of=['strings'], or_other_arguments,
»   »   »   »   »   »   »   and_another)

let_us_pass.some_function(with_a_lot_of=['strings'], or_other_arguments,
»   »   »   »   »   »   ··and_another)

Таким образом, Flake8 не жалуется на смешивание блоков из 4 пробелов и одиночных пробелов.
Все, что я могу найти в PEP8, это комментарий в примере: # Hanging indents *may* be indented to other than 4 spaces.

Означает ли это, что это осуждается? Должен ли я продолжать очищать все предупреждения Flake8 (и смешивать количество пробелов) или жить с предупреждениями, чтобы поддерживать чистоту 4 пробелов.


person thosphor    schedule 18.10.2018    source источник
comment
Вот соответствующий раздел PEP8: python.org/dev/peps/pep -0008/#отступ   -  person 0x5453    schedule 18.10.2018
comment
«(Под вкладкой я имею в виду, что я нажимаю клавишу табуляции, и мой редактор вставляет 4 пробела)» — пожалуйста, не называйте это табуляцией. Это нечто совершенно другое. Если вы используете отступы в четыре пробела плюс несколько дополнительных пробелов, вы не смешиваете пробелы и табуляции. Невозможно узнать, что существуют разные кратные пробелы. Это не совсем то.   -  person Chris    schedule 18.10.2018
comment
@Chris Я использую другую терминологию, чтобы различать блоки из четырех пробелов, используемые для строгого отступа в Python, и добавляя дополнительные пробелы для визуального стиля. Я все равно отредактирую.   -  person thosphor    schedule 18.10.2018
comment
@ 0x5453 Я знаю. Я процитировал этот раздел PEP8 в вопросе.   -  person thosphor    schedule 18.10.2018
comment
@thosphor это все пробелы, ваш редактор просто конвертирует TAB для удобства. Самый первый пример «да» в ссылке, которую вам дали, — это #Aligned with opening delimiter., точно такой же, как ваш пример 3 в вопросе. Ваши первые два подхода соответствуют первому примеру No того же раздела. У вас нет отступа, поэтому ваш комментарий может использоваться не применяется.   -  person roganjosh    schedule 18.10.2018
comment
@Chris, подавляющее большинство современных текстовых редакторов используют эмулированные вкладки. они не преобразуют вкладку True во что-либо, когда они получают клавишу табуляции, они по умолчанию вставляют несколько пробелов. Делать это в наши дни — значит цепляться за священную войну/крестовый поход Tabs vs Spaces давно ушедшей эпохи.   -  person Thunderwood    schedule 18.10.2018
comment
@Thunderwood, это совершенно не имеет значения, и я не цепляюсь за священную войну. Я прошу OP правильно описать, что происходит, вместо того, чтобы запутывать его, используя неправильные термины. клавиша табуляции отличается от символа табуляции. Здесь нет смешивания пробелов и вкладок.   -  person Chris    schedule 18.10.2018
comment
@Thunderwood, за исключением того, что смешивание реальных вкладок и пробелов вызовет ошибку в Python, которая на самом деле немного возникает здесь, и вы делаете предположение, что у них определенно есть редактор, который делает это. Здесь люди, кодирующие в блокноте, задают вопросы...   -  person roganjosh    schedule 18.10.2018
comment
@roganjosh ~~ Я не думаю, что мои первые два примера соответствуют разделу no, о котором вы говорите в PEP8, поскольку отступ не вносит двусмысленности. ~~ Понял, что пропустил решающую часть одного из примеров no. : # Arguments on first line forbidden when not using vertical alignment   -  person thosphor    schedule 18.10.2018
comment
Он ничего не говорит о двусмысленности, он говорит # Arguments on first line forbidden when not using vertical alignment. У вас есть аргументы в первой строке, и только ваш 3-й пример выровнен по вертикали.   -  person roganjosh    schedule 18.10.2018
comment
@roganjosh Справедливое замечание. Я забыл, что не только эксцентрики VI и EMAC должны заниматься этой проблемой: P   -  person Thunderwood    schedule 18.10.2018
comment
@Thunderwood, в настоящее время в большинстве случаев, когда люди говорят о вкладках, подразумевается, что они имеют в виду эмулированные вкладки ... большинство людей на самом деле больше не используют настоящие вкладки, вы делаете предположения, и те, которые я считаю неверными. В наши дни многие люди используют табуляцию, и даже если бы они этого не делали, символы табуляции все еще существуют. Когда в заголовке вопроса говорится о смешении табуляций и пробелов, вы серьезно думаете, что они используют какую-то модель (n × indent_level + alignment) × ' '?   -  person Chris    schedule 18.10.2018
comment
@roganjosh Отредактировал мой комментарий. (Я имел в виду второй пример без примера, так как он говорит о различимости)   -  person thosphor    schedule 18.10.2018
comment
@Chris, все, что я говорю, это то, что эмулированные вкладки используются в большинстве современных текстовых редакторов. Ты знаешь это, я знаю это. Когда парень говорит вкладки, А ПОТОМ УТОЧНЯЕТ, что он имеет в виду эмулированные вкладки, на самом деле нет необходимости прыгать ему в глотку в разделе комментариев. Мы знаем, что такое эмулируемые вкладки. Мы знаем, что это не настоящие вкладки. Нет смысла извергать факты. Ну, вообще-то... парень в комментариях   -  person Thunderwood    schedule 18.10.2018
comment
@Thunderwood, за исключением того, что в этом есть смысл. Stack Overflow помогает людям учиться. Это включает в себя ОП, который, я надеюсь, будет более осторожно говорить о вкладках в будущем (поскольку называть группы из четырех пробелов вкладкой объективно неправильно), и других пользователей, которые, я надеюсь, не будут сбиты с толку, когда они прочитают это позже. И перестаньте полагаться на то, что вы думаете больше всего и что делает большинство. Вы не знаете, какой редактор использует этот человек и как он настроен. И, опять же, это не только для OP — это для всех остальных с подобным вопросом в будущем. Перестаньте предполагать вещи.   -  person Chris    schedule 18.10.2018
comment
@Chris Мой первоначальный пост был осторожен в том смысле, что у меня было разъяснение. Поскольку PEP8 определяет отступ в 4 пробела, я подумал, что будет проще говорить об этом конкретном вопросе, используя табуляцию в качестве 4 пробелов. Кстати, единственный раз, когда я запутался с вкладками/пробелами, это наоборот. Я всегда задавался вопросом, почему из-за этого была война, поскольку я предполагал, что каждый редактор вставляет 2/4/8 пробелов, когда они нажимают клавишу табуляции.   -  person thosphor    schedule 18.10.2018
comment
@thosphor, я уйду, вместо того чтобы продолжать спорить. Но в оригинальном заголовке вопроса конкретно говорилось о смешении табуляций и пробелов, что нам кое-что говорит. Затем мы загружаем вопрос и на полпути обнаруживаем, что на самом деле вы говорите о чем-то совершенно другом. Ваш заголовок должен четко обобщать ваш вопрос, и ваш вопрос должен быть понятен с самого начала, а не с середины. Четко задавать вопросы — это самое важное, что могут здесь сделать спрашивающие.   -  person Chris    schedule 18.10.2018
comment
@ Крис, твое уточнение названия было полезно, да.   -  person thosphor    schedule 18.10.2018


Ответы (1)


Цитата из сноски на соответствующей странице PEP8:

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

# Hanging indents *may* be indented to other than 4 spaces.
foo = long_function_name(
  var_one, var_two,
  var_three, var_four)

Это не тот случай, что в вашем примере, поскольку у вас есть аргументы в первой строке. PEP8 утверждает, что аргументы функции должны быть выровнены по вертикали, поэтому Flake8 здесь прав. Не беспокойтесь о «поддержании чистоты 4-пространства», если это нарушит другие правила PEP8.

Если вам действительно не нравятся пробелы, не кратные 4, вы можете переключиться на один из следующих стилей:

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

# Hanging indents should add a level.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)
person 0x5453    schedule 18.10.2018