Почему Python pep-8 настоятельно рекомендует использовать отступы над вкладками для отступа?

146

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

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

quamrana
источник
7
Прочитайте обсуждение PEP, чтобы узнать.
Э-Удовлетворение
106
1 уровень отступа ... 1. Совершенно нелогично договариваться об использовании N пробелов, когда вы все можете использовать одну вкладку. Что, кстати, именно для этого и предназначено. Отступ. Однажды. 1 уровень отступа = 1 одиночный символ, т.е. 1 одиночная табуляция. И они более удобны, потому что каждый кодировщик может свободно выбирать, как его визуализировать. Использование пробелов глупо, я никогда не видел ни одного аргумента для этого, который не глуп.
о0 '.
31
@BlueBomber, и почему вы не заставляете людей выбирать размер шрифта и цветовую схему, которые вам нравятся, пока вы это делаете? Все еще глупо.
о0 '.
10
@BlueBomber нет, нет, это точно на том же уровне абсурда.
о0 '.
9
@BlueBomber В чем именно разница? Вы уменьшаете степень свободы в настройках среды другого разработчика, не добиваясь заметных преимуществ. Если вы хотите быть диктатором и заставлять всех смотреть на код с отступом, соответствующим 2, 4 или 29 пробелам, вы все равно можете сделать это с помощью вкладок. Просто попросите ваших подчиненных установить их IDE для отображения вкладок в соответствии с вашим предпочтительным количеством пробелов. Если у вас нет полномочий делать это, возможно, вы должны позволить им самим решить, насколько широкая единица отступа удобна для их глаз.
Асад Саидуддин

Ответы:

111

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

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

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

Иными словами, рассмотрим также сферу применения ПКП, как указано в самом первом абзаце:

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

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

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

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

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

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


источник
11
Согласовано. Согласованность важнее, чем табуляция против X пробелов и Y пробелов.
Майк Кларк
10
меня удивляет ... почему в стандартной библиотеке так много имен методов mixedCase?
Кайл Уайлд
6
@dorkitude: а) никто не идеален. б) исторические причины.
8
Итак, почему же так много программистов решили использовать пробелы до PEP-8? Это то, что я действительно хочу знать. Преимущества вкладок кажутся мне очевидными, но не пробелами.
einnocent
95

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

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

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

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

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

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

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

nigratruo
источник
26
Чтобы добавить к этому, взгляните на свою клавиатуру, символ клавиши TAB четко отображает отступ - это назначение клавиши с отступом, а не ПРОБЕЛ. PEP8 рекомендует использовать пробелы, это ошибка ИМХО, но это всего лишь рекомендация - en.wikipedia.org/wiki/Tab_character#Tab_characters
Даниэль Соколовский
29
Согласен с этим постом целиком. Использование пробелов предназначено для дураков, которым нравится получать ошибки из-за ошибок отступа в 1 пробел. Если ваш отступ был отключен на 1 вкладку, я гарантирую, что вы заметите это.
Сеперо
12
@ Zingham Никто не может использовать вкладки исключительно: вкладки и пробелы всегда используются в сочетании, что приводит к несогласованности. Я и тысячи других использую их довольно последовательно каждый день. Вкладки для отступа, пробелы для выравнивания. Какую часть этой концепции вам так трудно понять, и почему вы убеждены, что ее невозможно применять последовательно?
antred
1
Фактическая проблема с вкладками заключается в том, что вы не можете получить точную индексацию символа, рекомендованную тем же PEP8 под комментарием «# Выровнен с открывающим разделителем». Это единственная причина, по которой предпочтение отдано пробелам: чтобы получить правильный отступ!
user541905
2
Вопрос в том, почему Python pep-8 настоятельно рекомендует использовать пробелы над вкладками для отступов? , В этом ответе ничего не говорится о PEP8. ||| Вместо того, чтобы пытаться ответить на вопрос ... этот ответ мне кажется одним огромным снисходительным в первую очередь мнением . Есть 276 слов, используемых для обозначения «табуляция лучше, чем пробел, и вот почему ...».
Тревор Бойд Смит
43

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

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

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

Soviut
источник
3
Я пытался заставить себя тоже использовать пробелы, но мудрые вкладки редактора (по крайней мере, Eclipse + PyDev) выигрывают, особенно если вы включаете показ невидимых символов. И я могу легко установить вкладки на 4, 8, 6 пробелов визуально. Так что в моем коде, по крайней мере, я ценю личные предпочтения и придерживаюсь пробелов, если это является установленным соглашением в существующей кодовой базе.
Даниэль Соколовский
2
Это хорошо, если вы не программируете в команде. Когда вы в команде, вы соглашаетесь на единую конвенцию и придерживаетесь ее.
Совют
1
@Soviut Это похоже на то, как мне хочется думать. Во всех командах, в которых я когда-либо был, официальной линией вечеринки было «использовать пробелы». Реальность заключалась в том, что практически каждый файл представлял собой полный беспорядок как вкладок, так и пробелов, и даже в файлах, в которых последовательно использовались только пробелы или только вкладки, отступы все еще были повсюду.
Антред
Да, но это то, что я имел в виду. Некоторый консенсус в конечном итоге достигнут и применяется. Как вы сказали, это обычно "просто использовать пробелы".
Совют
это главная причина, почему я предпочитаю вкладки. Просто имеет смысл иметь отдельные символы для разметки и разграничения слов
woojoo666
31

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

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

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

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

С. Лотт
источник
15
Я бы никогда не пообещал сделать что-то неправильно, просто потому, что многие другие (люди, текстовые редакторы и т. Д.) Также оказываются неверными. В 2015 году в мусорном ведре находится текстовый редактор, который плохо обрабатывает вкладки.
Антред
2
«Вы не можете ошибиться с пробелами. Вы можете пойти не так с вкладками». Я обнаружил, что это неправильно на 100%. По моему опыту: «Вы не можете ошибиться с табуляцией. Вы можете ошибиться с пробелами» ... особенно когда вы делитесь кодом.
cmroanirgo
5
Итак, кто-то наконец сказал это: используйте пробелы, потому что это самый низкий общий знаменатель. Это же правило заставляет нас придерживаться MBR, BIOS и бумажных форм в государственных учреждениях. За исключением того, что у них действительно есть концептуальные проблемы, в то время как табуляция против пробелов - это 100% глупая проблема пользователя.
Milind R
1
Мне кажется, что это Argumentum ad populum: ошибочный аргумент, который заключает, что предложение верно, потому что многие или большинство людей верят в это. Поскольку каждый редактор может заменить вкладки пробелами, пробелы - правильный выбор, это ошибка !!
Джунзу
28

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

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

Томас Воутерс
источник
43
Это правда, что вкладки невидимы, и люди не могут договориться о ширине вкладок. Но то же самое относится и к пространствам. Когда вы смешиваете табуляции и пробелы, все идет не так. Но почему вы обвиняете эту ситуацию на вкладках, а не на пробелах?
Джим
47
Нет, то же самое не верно для пробелов. Люди могут договориться о ширине мест.
Рафал Доугирд
32
Один пробел всегда может иметь одинаковую ширину, но отступы с пробелами не всегда имеют одинаковую ширину. Я не вижу, как согласие использовать табуляцию на n пробелов по ширине отличается от согласия на отступ с n пробелами.
Джим
26
Да, я знаю, что проблемы смешивания могут вызвать Чего я не понимаю, так это почему некоторые люди обвиняют это на вкладках. Проблема заключается в их смешивании, а не в вкладках. Вы можете решить проблему, заменив табуляцию пробелами, но вы также можете решить проблему, заменив пробелы табуляцией.
Джим
70
И нет, если я использую вкладки шириной 8, а вы используете вкладки шириной 6, и мы делимся кодом, он не будет испорчен. Это всего лишь одна вкладка для интерпретатора Python.
Джим
22

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

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

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

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

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

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

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

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

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

Брайан
источник
3
Выравнивание тривиально, хотя. Я просто использую скобки как блок и делаю отступ для каждого аргумента. Кроме того, в вашем примере вы очень хорошо можете использовать пробелы, так как вы находитесь внутри списка аргументов, и вы можете разместить там столько пробелов, сколько захотите.
Совют
3
@Soviut: Если вы сделаете отступ с пробелами, выравнивание испортится, как только оно будет просмотрено с другим размером вкладки. Единственный способ сохранить его - использовать вкладки до уровня отступа, а затем пробелы для остальных - т. Е. Смешивать пробелы и вкладки, что приводит к собственным проблемам.
Брайан
Да, именно поэтому я склонен в любом случае просто использовать соглашение Python о отступе блока для своих аргументов. Конечно, они могут не совпадать с открытой скобкой, но все равно ясно, к какой строке или команде они принадлежат. Синтаксис JQuery работает по аналогичному принципу.
Совют
2
@ Брайан: я не вижу, как это приводит к каким-либо проблемам. Это совершенно правильный путь, вкладки для отступа, пробелы для выравнивания. Это совсем не то же самое, что смешивать пробелы и вкладки для отступа .
antred
1
@CoreDumpError Ух нет, это точно не так. Я знаю это, потому что Python 3 никогда не жалуется ни на один из моих скриптов, и я использую вкладки для отступов / пробелов, чтобы выровнять все проклятое время. Кроме того, PEP8 не может ничего «запретить», так как это всего лишь рекомендация (и, на мой взгляд, заумная).
antred
12

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

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

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

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

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

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

Тейн Бримхолл
источник
7

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


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

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

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

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

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

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


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

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

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

quamrana
источник
1
Какой редактор вы используете? Большинство из тех, что я использовал, имеют опцию dedent на backspace (например, emacs ведет себя так), независимо от реализации отступа.
Брайан
Вы правы - я не вижу опции отступить на backspace, но вы, вероятно, можете справиться с этим, используя shift-tab или уменьшить отступ (вместо этого - ctrl-shift-i).
Брайан
Я просто пробую PyScripter, который, кажется, загружается лучше при использовании пробелов, когда вы нажимаете tab, и удаляете их в 4, когда вы нажимаете backspace.
Quamrana
28
"Я должен удалить пробелы! Arrgh! В четыре раза больше удаляет, чем вкладки!" - Это единственная причина, по которой я использую вкладки для всего, и почему я считаю людей, которые используют пробелы, безумными. :) У меня никогда не было проблем, кроме случаев, когда я вставляю что-то из Интернета, которое использует пробелы. Тогда простой поиск-замена исправляет это.
Aphex
3

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

Скайлер
источник
2

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

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

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

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

Марк Сидаде
источник
10
Я бы сделал наоборот: у вкладок есть семантическое значение для отступа, поэтому более чувствительно хранить вкладки и отображать пробелы. Пользователь может выбрать стиль форматирования, и редактор будет соответственно расширять вкладки.
AkiRoss
1
У вас все еще есть проблема смешанных вкладок и пробелов, а также одного автора, использующего 1 столбец на вкладку и делающего отступы 4+ раза, что выглядело бы сумасшедшим в текстовом редакторе, отображающем каждый символ вкладки шириной в 4 столбца. Вкладки для отступа имеют смысл в текстовом редакторе с переменной шириной, например в текстовом редакторе, использующем пропорционально расположенные шрифты. Не так много с текстовым редактором с фиксированной шириной.
Марк Сидаде
2
Нет, я имел в виду, что текстовый редактор должен уметь анализировать грамматику языка и понимать, когда происходит табуляция, чтобы вкладки можно было использовать только как средство форматирования, и не было бы необходимости использовать пробелы для отступа. «tab» не обязательно должен иметь фиксированную ширину, и я нахожу в целом позорным то, что с современными методами (например, машинным обучением) форматирование все еще является проблемой для программистов. Все должно быть автоматизировано и должно быть автоматизировано и прозрачно.
AkiRoss
Я не понимаю, как это могло бы понять это.
Марк Сидаде
1

Поскольку python использует отступы для распознавания структуры программы, требуется четкий способ идентификации идентификаторов. Это причина выбора пробелов или табуляции.

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

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

Флориан Бош
источник
8
И поскольку каждый редактор также может выбрать свою цветовую схему, как вы думаете, должны ли они также указывать, какую цветовую схему использовать?
о0 '.
8
Да, но разве это несоответствие не имеет больше смысла? Потому что это просто вопрос визуальных предпочтений. Если я предпочитаю больший «выглядящий» отступ в моем редакторе, я могу установить для моих вкладок 8 пробелов, если я предпочитаю меньше, я могу установить его на 2. Таким образом, код, фактически не меняя форматирование, лучше подходит для человека, который наблюдая за этим.
dennmat
8
Я согласен с dennmat: если я визуально предпочитаю 2 пробела, а Гвидо визуально предпочитает 4 пробела, то логичным выбором будет использование отступа табуляции.
Сеперо
0

Самое значительное преимущество, которое я могу сказать о пробелах над вкладками, состоит в том, что многие программисты и проекты используют заданное количество столбцов для исходного кода, и если кто-то фиксирует изменение, установив для табуляции 2 пробела, и проект использует 4 пробела в качестве табуляция длинных строк будет слишком длинной для окна редактора других людей. Я согласен, что с вкладками легче работать, но я думаю, что пространства легче для совместной работы, что важно в большом проекте с открытым исходным кодом, таком как Python.

sirwart
источник
2
это неправильно: это происходит только в том случае, если вы смешиваете табуляции и пробелы, и вы в равной степени решаете эту проблему, заставляя всех использовать табуляции вместо пробелов.
о0 '.
0

Вы можете съесть свой торт и съесть его. Настройте редактор для автоматического расширения вкладок в пробелы.

(Это было бы :set expandtabв Vim.)

Род Дауноравичюс
источник
0

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

Брайан Кронрат
источник
-1

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

  1. Если редактор не показывает вкладки (что случается, в зависимости от конфигурации, во многих случаях), другой автор может предположить, что ваш код использует 4 пробела, b / c почти весь код Python, доступный для общественности, делает; если у того же редактора ширина вкладки равна 4, могут произойти неприятные вещи - по крайней мере, этот бедняк потеряет время из-за проблемы с отступами, которую было бы очень легко избежать, придерживаясь соглашения. Поэтому для меня причина номер один - избегать ошибок в последовательности.

  2. Переосмысливая вопрос о том, какие вкладки лучше, вкладки или пробелы, следует спросить, каковы преимущества вкладок; Я видел много постов, восхваляющих вкладки, но мало веских аргументов для них; хорошие редакторы, такие как emacs, vi (m), kate, ... делают правильные отступы в зависимости от семантики вашего кода - даже без вкладок; одни и те же редакторы могут быть легко настроены для удаления отступов в Backspace и т. д.

  3. Некоторые люди имеют очень сильные предпочтения, когда речь заходит об их свободе в выборе внешнего вида / макета кода; другие ценят последовательность над этой свободой. Python резко уменьшает эту свободу, диктуя, что отступы используются для блоков и т. Д. Это может быть воспринято как ошибка или особенность, но вроде как при выборе Python. Лично мне нравится эта последовательность - когда начинаешь кодировать новый проект, по крайней мере, макет близок к тому, к которому я привык, поэтому его довольно легко читать. Почти всегда.

  4. Использование пробелов для отступа допускает «уловки компоновки», которые могут облегчить понимание кода; некоторые примеры из них перечислены в PEP8; например.

    foo = long_function_name(var_one, var_two,
                             var_three, var_four)
    
    # the same for lists
    a_long_list = [1,
                   2,
                   # ...
                   79]
    
    # or dictionaries
    a_dict = {"a_key": "a_value",
              "another_key": "another_value"}

    Конечно, вышесказанное также можно записать как

    foo = long_function_name(
        var_one, var_two,
        var_three, var_four)
    
    # the same for lists
    a_long_list = [
        1,
        2,
        # ...
        79]
    
    # or dictionaries
    a_dict = {
        "a_key": "a_value",
        "another_key": "another_value"}

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

  5. Возвращаясь к тому же аргументу, что и все остальные - PEP 8 диктует (хорошо, настоятельно рекомендует) пробелы. Если вы приходите в проект, который использует только вкладки, конечно, у вас мало выбора. Но из-за установления соглашений PEP 8 почти все программисты Python привыкли к этому стилю. Это значительно упрощает поиск консенсуса по стилю, принятому большинством программистов ... и в противном случае согласие людей на стиль может быть очень сложным.

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

Джеральд Сенаркленс де Гранси
источник
-3

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

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

С пробелами сомнений нет. Все выстроится так, как задумал автор.

Benoit
источник
14
Еще один, кто в корне неправильно понял вкладку ... возьми механическую пишущую машинку и поиграй с ней некоторое время, правда! 1 вкладка не равна 8 пробелам! это равно up_to_8_spaces ! otoh: с пропорциональными шрифтами вкладки - единственный способ гарантировать выравнивание.
3
Msgstr "В данном редакторе вкладка может содержать 8 пробелов или 2". Если мне нравятся 4 пробела, а моему другу нравятся 8 пробелов или 2 пробела или 3 пробела или и т. Д. Тогда мы можем согласовать вкладки, потому что (будучи выделенными знаками отступа ), редактор знает, что это такое, и может отображать их соответственно. Я вижу код с отступами в 4 пробела, вы видите его с отступами в 8 пробелов, наш странный друг использует его 3 пробела, и все круто. Обстоятельства (особенно в Python!), Когда ширина самой вкладки будет иметь значение, настолько редки, что даже сторонники пространства редко поднимают их.
JamesTheAwesomeDude
-4

О дискуссии между Джимом и Томасом Воутерсом в комментариях.

Проблема заключалась в том ... что ширина вкладок и пробелов могут различаться - и поскольку программисты не могут договориться ни о какой ширине - почему виноваты вкладки.

Я согласен с Джимом в этом - вкладки НЕ являются злом сами по себе. Но есть проблема...

С пробелами я могу контролировать, как «МОЙ СОБСТВЕННЫЙ КОД» выглядит в КАЖДОМ редакторе мира. Если я использую 4 пробела - тогда независимо от того, в каком редакторе вы открываете мой код, он будет иметь одинаковое расстояние от левого поля. С вкладками я в зависимости от настройки ширины вкладок для редактора - даже для МОЕГО СОБСТВЕННОГО КОДА. И мне это не нравится.

Поэтому, хотя это правда, что даже пробелы не могут гарантировать согласованность - они по крайней мере дают вам больше контроля над внешним видом вашего СОБСТВЕННОГО кода, чего не могут делать вкладки.

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

treecoder
источник
6
Вы «во власти настройки ширины табуляции для редактора»? Если ваш редактор не позволяет установить желаемую ширину вкладки, возможно, вы используете notepad.exe
user137369
4
@zigg Это абсолютно не имеет отношения к аргументу, поскольку он (она?) говорит конкретно о своем собственном коде (эта информация даже выделена жирным шрифтом, курсивом и всеми заглавными буквами). Нигде к обсуждению делиться кодом не актуально.
user137369
1
Редакторы - не единственные инструменты для просмотра кода. Есть также diff, tracebacks, Github и другие веб-страницы, и так далее, все они выберут некоторую ширину вкладки вне вашего контроля (вероятно, 8).
RemcoGerlich
Я понимаю вашу точку зрения. Вы действительно контролируете, как все видят ваш код (в отношении отступов). Следующим шагом будет контроль типа шрифта и цвета, которые все будут использовать для просмотра вашего кода. После этого вы готовы доминировать над самим миром, а не только за редакторы кода!
Джунзу