Почему Python pep-8 настоятельно рекомендует использовать отступы над вкладками для отступа? - PullRequest
133 голосов
/ 23 сентября 2008

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

Есть ли основополагающая причина для предпочтения пробелов? Я бы подумал, что с вкладками работать гораздо проще.

Ответы [ 17 ]

101 голосов
/ 23 сентября 2008

Ответ был дан прямо в PEP [ред .: этот отредактирован в 2013 ]. Я цитирую:

самый популярный способ отступа в Python - только с пробелами.

Какая еще основная причина вам нужна?

Проще говоря: рассмотрите также сферу действия ПКП, как указано в самом первом абзаце:

В этом документе приведены соглашения по кодированию для кода Python, включающего стандартную библиотеку в основном дистрибутиве Python.

Намерение состоит в том, чтобы сделать весь код, который идет в официальном дистрибутиве Python , последовательно отформатированным (я надеюсь, мы можем согласиться, что это универсально Good Thing ™).

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

Гвидо был тем, кто выбрал. Ему даже не нужно было объяснять причину, но он все же ссылался на эмпирические данные.

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

Но если я могу дать вам один совет: не смешивайте их ;-) [ed: Смешивание табуляции и пробелов больше не вариант.]

80 голосов
/ 19 февраля 2011

Ну, похоже, все сильно склонны к пробелам. Я использую только вкладки. Я очень хорошо знаю, почему.

Вкладки - это действительно классное изобретение, которое появилось после пробелов. Это позволяет делать отступ, не нажимая пробел миллионы раз или используя поддельную вкладку (которая создает пробелы).

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

Ваш редактор не может правильно обрабатывать вкладки? Ну, возьми современный редактор. Может быть, это чертово время, мы сейчас в 21 веке, и время, когда редактор был высокотехнологичным сложным программным обеспечением, давно прошло. Теперь у нас есть тонны и тонны редакторов, и все они прекрасно поддерживают вкладки. Кроме того, вы можете определить, какой должна быть вкладка, что нельзя делать с пробелами. Не видите вкладки? Что это за аргумент? Ну, вы не можете видеть пробелы ни!

Могу ли я быть настолько смелым, чтобы предложить лучший редактор? Один из этих высокотехнологичных продуктов, выпущенный около 10 лет назад, который отображает невидимые символы ? (сарказм выключен)

Использование пробелов влечет за собой гораздо больше операций по удалению и форматированию. Вот почему (и все другие люди, которые знают это и согласны со мной), используют вкладки для Python.

Смешение табуляции и пробелов - это нет-нет и не спор об этом. Это беспорядок и никогда не может работать.

38 голосов
/ 16 мая 2009

Лично я не согласен с пробелами над вкладками. Для меня вкладки являются символом / механизмом макета документа, а пробелы предназначены для содержания или разграничения команд в случае кода.

Я должен согласиться с комментариями Джима, что вкладки - это не проблема, а люди и то, как они хотят смешивать вкладки и пробелы.

Тем не менее, я заставил себя использовать пробелы для удобства. Я ценю последовательность, а не личные предпочтения.

28 голосов
/ 23 сентября 2008

Причина пробелов в том, что вкладки являются необязательными. Пробелы являются фактическим наименьшим общим знаменателем в пунктуации.

В каждом приличном текстовом редакторе есть «заменить вкладки пробелами», и многие люди используют это. Но не всегда.

Хотя некоторые текстовые редакторы могут заменять пробелы на табуляцию, это действительно редко.

Итог . Вы не можете ошибиться с пробелами. Вы могли бы пойти не так с вкладками. Поэтому не используйте вкладки и уменьшите риск ошибок.

25 голосов
/ 23 сентября 2008

Проблема с вкладками заключается в том, что они невидимы, и люди никогда не могут договориться о ширине вкладок. Когда вы смешиваете табуляцию и пробелы и устанавливаете таб-стопы на что-то отличное от Python (который использует табуляции на каждые 8 ​​пробелов), вы увидите код в другом макете, чем Python видит. А поскольку макет определяет блоки, вы увидите другую логику. Это приводит к тонким ошибкам.

Если вы настаиваете на игнорировании PEP 8 и использовании табуляции - или, что еще хуже, смешивании табуляции и пробелов - по крайней мере всегда запускайте python с аргументом '-tt', что делает отступ непоследовательным (иногда таб, иногда пробел для того же уровня отступа) ошибка. Также, если возможно, настройте редактор так, чтобы вкладки отображались по-другому. Но на самом деле лучший подход - не использовать вкладки, точка.

22 голосов
/ 27 сентября 2008

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

Однако, ИМХО, есть несколько незначительных причин отдавать предпочтение пробелам над вкладками:

  • Различные инструменты. Иногда код отображается за пределами редактора программиста. Например. размещены в группе новостей или на форуме. Пробелы, как правило, здесь лучше, чем вкладки - везде пробелы могут быть искажены, вкладки тоже, но не наоборот.

  • Программисты видят источник по-другому. Это глубоко субъективно - это либо главное преимущество вкладок, либо причина избегать их в зависимости от того, на какой стороне вы находитесь. С другой стороны, разработчики могут просматривать источник со своими предпочтительными отступами, поэтому разработчик, предпочитающий отступ с 2 пробелами, может работать с разработчиком с 8 пробелами в том же источнике и по-прежнему видеть его так, как ему нравится. Недостатком является то, что это имеет последствия - некоторые люди любят 8-пробел, потому что это дает очень заметную обратную связь, что они слишком глубоко вложены - они могут видеть код, проверенный 2-индентором, постоянно заключенным в их редакторе. Если каждый разработчик увидит код одинаково, это приведет к большей согласованности по отношению к длине строки и другим вопросам.

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

    def foo():
        x = some_function_with_lots_of_args(foo, bar, baz,
                                            xyzzy, blah)
    

    При использовании вкладок нет способа выровнять это для людей, использующих различные вкладки в их редакторе без смешивания пробелов и вкладок. Это эффективно убивает вышеуказанное преимущество.

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

Также стоит прочитать эту статью Джейми Завински по этому вопросу.

10 голосов
/ 03 августа 2013

Обратите внимание, что использование вкладок сбивает с толку еще один аспект PEP 8:

Ограничить все строки максимум 79 символами.

Предположим, гипотетически, что вы используете ширину табуляции 2, а я ширину табуляции 8. Вы пишете весь свой код так, что ваши самые длинные строки достигают 79 символов, затем я начинаю работать с вашим файлом. Теперь у меня есть трудно читаемый код, потому что (как утверждает PEP):

Упаковка по умолчанию в большинстве инструментов нарушает визуальную структуру кода

Если мы все используем 4 пробела, это ВСЕГДА одинаково. Любой, чей редактор может поддерживать ширину 80 символов, может с комфортом прочитать код. Примечание: ограничение в 80 символов само по себе является священной войной, поэтому не будем начинать это здесь.

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

7 голосов
/ 27 сентября 2008

Ответ на вопрос: ПКП-8 хочет дать рекомендацию и решил, что, поскольку пробелы более популярны, он настоятельно рекомендует пробелы над табуляциями.


Примечания к ПКП-8

PEP-8 говорит: 'Используйте 4 пробела на уровень отступа.'
Понятно, что это стандартная рекомендация.

'Для действительно старого кода, который вы не хотите испортить, вы можете продолжать использовать вкладки с 8 пробелами.'
Понятно, что есть НЕКОТОРЫЕ обстоятельства, когда можно использовать вкладки.

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

'Самый популярный способ сделать отступ для Python - использовать только пробелы. Второй по популярности способ - только с вкладками. '
Это ясно заявляет, что оба используются. Просто чтобы быть предельно ясным: вы никогда не должны смешивать пробелы и табуляции в одном файле.

'Для новых проектов настоятельно рекомендуется использовать только пробелы над вкладками.'
Это четкая и сильная рекомендация, но не запрещение вкладок.


Я не могу найти хороший ответ на свой вопрос в PEP-8. Я использую вкладки, которые я исторически использовал на других языках. Python принимает исходный код с эксклюзивным использованием вкладок. Это достаточно хорошо для меня.

Я думал, что мне стоит поработать с пробелами. В моем редакторе я настроил тип файла для использования исключительно пробелов, поэтому он вставляет 4 пробела, если я нажимаю клавишу Tab. Если я нажимаю клавишу Tab слишком много раз, я должен удалить пробелы! Arrgh! В четыре раза больше удаляет, чем вкладки! Мой редактор не может сказать, что я использую 4 пробела для отступов (хотя редактор AN мог бы сделать это) и, очевидно, настаивает на удалении пробелов по одному.

Нельзя ли было сказать, чтобы Python считал символы табуляции n пробелами при чтении отступов? Если бы мы могли согласовать 4 пробела для отступа и 4 пробела для табуляции и позволить Python принять это, проблем не было бы.
Мы должны найти беспроигрышные решения проблем.

3 голосов
/ 05 января 2012

Я всегда использовал вкладки в своем коде. Тем не менее я недавно нашел причину использовать пробелы: при разработке на моем интернет-планшете Nokia N900 у меня теперь была клавиатура без клавиши табуляции. Это заставило меня либо копировать и вставлять вкладки, либо переписывать код с пробелами. Я столкнулся с той же проблемой с другими телефонами. Конечно, это не стандартное использование Python, но кое-что, о чем следует помнить.

3 голосов
/ 27 сентября 2008

JWZ говорит, что лучше :

Когда [люди] читают код, и когда они заканчивают писать новый код, они заботятся о том, сколько экранных столбцов отступает от кода, когда открывается новая область (или sexpr, или что-то еще) ...

... Мое мнение таково, что лучший способ решить технические проблемы - предписать, чтобы символ ASCII # 9 никогда не появлялся в дисковых файлах: запрограммируйте свой редактор, чтобы расширять TAB до соответствующего числа пробелов перед записью строк. на диск ...

... Это предполагает, что вы никогда не используете вкладки в местах, где они действительно значимы, например, в строковых или символьных константах, но я никогда не делаю этого: когда важно, что это вкладка, я всегда использую '\ t' вместо.

...