В Stack Overflow и PEP 8 я вижу, что рекомендуется использовать пробелы только для отступов в программах Python. Я могу понять необходимость последовательного отступа, и я почувствовал эту боль.
Есть ли основополагающая причина для предпочтения пробелов? Я бы подумал, что с вкладками работать гораздо проще.
python
indentation
quamrana
источник
источник
Ответы:
Ответ был дан прямо в PEP [ред .: этот отредактирован в 2013 году ]. Я цитирую:
Какая еще основная причина вам нужна?
Иными словами, рассмотрим также сферу применения ПКП, как указано в самом первом абзаце:
Намерение состоит в том, чтобы сделать весь код, который идет в официальном дистрибутиве Python, последовательно отформатированным (я надеюсь, мы сможем согласиться, что это универсально Good Thing ™).
Поскольку решение между пробелами и табуляциями для отдельного программиста а) действительно является делом вкуса и б) легко решается техническими средствами (редакторами, сценариями преобразования и т. Д.), Существует четкий способ завершить все обсуждения: выберите один ,
Гвидо был тем, кто выбрал. Ему даже не нужно было объяснять причину, но он все же ссылался на эмпирические данные.
Для всех других целей вы можете либо принять этот PEP в качестве рекомендации, либо игнорировать его - по вашему выбору, или вашей команды, или ее руководителей.
Но если я могу дать вам один совет: не смешивайте их ;-) [ed: Смешивание табуляции и пробелов больше не вариант.]
источник
Ну, хорошо, кажется, что все сильно склонны к пробелам. Я использую исключительно вкладки. Я очень хорошо знаю, почему.
Закладки на самом деле классное изобретение, которое пришло после пробелов. Это позволяет делать отступ, не нажимая пробел миллионы раз или используя поддельную вкладку (которая создает пробелы).
Я действительно не понимаю, почему все дискриминируют использование вкладок. Это очень похоже на то, как пожилые люди дискриминируют молодых людей за выбор более новой более эффективной технологии и жалуются на то, что импульсный набор работает на каждом телефоне , а не только на этих модных новых. «Тональный набор не работает на каждом телефоне, поэтому он неправильный».
Ваш редактор не может правильно обрабатывать вкладки? Ну, возьми современный редактор. Может быть, это чертово время, мы сейчас в 21 веке, и время, когда редактор был высокотехнологичным сложным программным обеспечением, давно прошло. Теперь у нас есть тонны и тонны редакторов, и все они прекрасно поддерживают вкладки. Кроме того, вы можете определить, какой должна быть вкладка, что нельзя делать с пробелами. Не видите вкладки? Что это за аргумент? Ну, вы также не можете видеть пробелы!
Могу ли я быть настолько смелым, чтобы предложить лучший редактор? Один из этих высокотехнологичных, выпущенных около 10 лет назад, с невидимыми персонажами ? (сарказм выключен)
Использование пробелов влечет за собой гораздо больше операций по удалению и форматированию. Вот почему (и все другие люди, которые знают это и согласны со мной) используют вкладки для Python.
Смешение табуляции и пробелов - это аргументы «нет-нет» и «нет». Это беспорядок и никогда не может работать.
источник
Я лично не согласен с пробелами над вкладками. Для меня вкладки являются символом / механизмом макета документа, а пробелы предназначены для содержания или разграничения команд в случае кода.
Я должен согласиться с комментариями Джима, что вкладки - это не проблема, а люди и то, как они хотят смешивать вкладки и пробелы.
Тем не менее, я заставил себя использовать пробелы для удобства. Я ценю последовательность, а не личные предпочтения.
источник
Причина пробелов в том, что вкладки не являются обязательными. Пробелы являются фактическим наименьшим общим знаменателем в пунктуации.
У каждого приличного текстового редактора есть «заменить вкладки пробелами», и многие люди используют это. Но не всегда.
Хотя некоторые текстовые редакторы могут заменить пробелы на табуляцию, это действительно редко.
Итог . Вы не можете ошибиться с пробелами. Вы можете пойти не так с вкладками. Так что не используйте вкладки и уменьшите риск ошибок.
источник
Проблема с вкладками в том, что они невидимы, и люди никогда не могут договориться о ширине вкладок. Когда вы смешиваете табуляцию и пробелы и устанавливаете таб-стопы в нечто отличное от Python (который использует таб-стопы через каждые 8 пробелов), вы увидите код в другом макете, чем Python видит. А поскольку макет определяет блоки, вы увидите другую логику. Это приводит к тонким ошибкам.
Если вы настаиваете на игнорировании PEP 8 и использовании табуляции - или, что еще хуже, смешивании табуляции и пробелов - по крайней мере всегда запускайте python с аргументом '-tt', что приводит к противоречивым отступам (иногда табуляция, иногда пробел для того же отступа) уровень) ошибка. Также, если возможно, настройте редактор так, чтобы вкладки отображались по-другому. Но на самом деле лучший подход не использовать вкладки, точка.
источник
Основные проблемы с отступами возникают при смешивании вкладок и пробелов. Очевидно, это не говорит о том, что вы должны выбрать, но это хорошая причина рекомендовать его, даже если вы выберете его, подбрасывая монетку.
Однако ИМХО есть несколько незначительных причин отдавать предпочтение пробелам над вкладками:
Разные инструменты. Иногда код отображается за пределами редактора программиста. Например. размещены в группе новостей или на форуме. Пробелы, как правило, здесь лучше, чем вкладки - везде пробелы могут быть искажены, вкладки тоже, но не наоборот.
Программисты видят источник по-другому. Это глубоко субъективно - это либо главное преимущество вкладок, либо причина избегать их в зависимости от того, на какой стороне вы находитесь. С другой стороны, разработчики могут просматривать источник со своими предпочтительными отступами, поэтому разработчик, предпочитающий отступ с 2 пробелами, может работать с разработчиком с 8 пробелами в том же источнике и по-прежнему видеть его так, как ему нравится. Недостатком является то, что это имеет последствия - некоторые люди любят 8-пробел, потому что это дает очень заметную обратную связь, что они слишком глубоко вложены - они могут видеть код, проверенный 2-индентором, постоянно заключенным в их редакторе. Тот факт, что каждый разработчик видит код одинаково, приводит к большей согласованности по длине строки и другим вопросам.
Продолжение отступа строки. Иногда вы хотите сделать отступ в строке, чтобы указать, что она перенесена из предыдущей. например.
При использовании вкладок, нет способа выровнять это для людей, использующих различные вкладки в их редакторе без смешивания пробелов и вкладок. Это эффективно убивает вышеуказанное преимущество.
Очевидно, что это глубоко религиозная проблема, которой страдает программирование. Самым важным вопросом является то, что мы должны выбрать один, даже если это не тот, который вы предпочитаете. Иногда я думаю, что самым большим преимуществом значительного отступа является то, что, по крайней мере, мы избавлены от пламенных войн размещения брекетов.
Также стоит прочитать эту статью Джейми Завински по этому вопросу.
источник
Обратите внимание, что использование вкладок смущает другой аспект PEP 8:
Предположим, гипотетически, что вы используете ширину табуляции 2, а я ширину табуляции 8. Вы пишете весь свой код так, что ваши самые длинные строки достигают 79 символов, а затем я начинаю работать над вашим файлом. Теперь у меня есть трудно читаемый код, потому что (как утверждает PEP):
Если мы все используем 4 пробела, это ВСЕГДА одинаково. Любой, чей редактор может поддерживать ширину 80 символов, может легко прочитать код. Примечание: ограничение в 80 символов само по себе является священной войной, поэтому давайте не будем начинать это здесь.
Любой несоответствующий редактор должен иметь возможность использовать пробелы, как если бы они были вкладками (как вставка, так и удаление), так что в действительности это не должно быть допустимым аргументом.
источник
Ответ на вопрос: PEP-8 хочет дать рекомендацию и решил, что, поскольку пробелы более популярны, он настоятельно рекомендует пробелы над вкладками.
Примечания к ПКП-8
PEP-8 говорит: «Используйте 4 пробела на уровень отступа».
Понятно, что это стандартная рекомендация.
«Для действительно старого кода, который вы не хотите портить, вы можете продолжать использовать вкладки с 8 пробелами».
Понятно, что есть НЕКОТОРЫЕ обстоятельства, когда можно использовать вкладки.
«Никогда не смешивайте табуляции и пробелы».
Это явный запрет на смешивание - я думаю, что мы все согласны с этим. Python может обнаружить это и часто задыхается. Использование аргумента -tt делает это явной ошибкой.
«Самый популярный способ сделать отступ в Python - использовать только пробелы. Второй по популярности способ - только с вкладками ».
Это ясно заявляет, что оба используются. Просто чтобы быть ультрачистым: вы никогда не должны смешивать пробелы и табуляции в одном файле.
«Для новых проектов настоятельно рекомендуется использовать пробелы поверх вкладок».
Это четкая и сильная рекомендация, но не запрещение вкладок.
Я не могу найти хороший ответ на свой вопрос в PEP-8. Я использую вкладки, которые я исторически использовал на других языках. Python принимает исходный код с эксклюзивным использованием вкладок. Это достаточно хорошо для меня.
Я думал, что я хотел бы поработать с пробелами. В моем редакторе я сконфигурировал тип файла для использования исключительно пробелов, поэтому он вставляет 4 пробела, если я нажимаю клавишу Tab. Если я нажимаю клавишу Tab слишком много раз, я должен удалить пробелы! Arrgh! Удаляет в четыре раза больше вкладок! Мой редактор не может сказать, что я использую 4 пробела для отступов (хотя редактор AN мог бы сделать это) и, очевидно, настаивает на удалении пробелов по одному.
Нельзя ли было сказать, что Python должен рассматривать табуляцию как n пробелов при чтении отступов? Если бы мы могли договориться о 4 пробелах на отступ и 4 пробела на табуляцию и позволить Python принять это, то проблем не было бы.
Мы должны найти беспроигрышные решения проблем.
источник
Я всегда использовал вкладки в своем коде. Тем не менее, я недавно нашел причину использовать пробелы: при разработке на моем интернет-планшете Nokia N900 у меня теперь была клавиатура без клавиши табуляции. Это заставило меня либо копировать и вставлять вкладки, либо переписывать код с пробелами. Я столкнулся с той же проблемой с другими телефонами. Конечно, это не стандартное использование Python, но кое-что, что нужно иметь в виду.
источник
JWZ говорит это лучше всего :
источник
Поскольку python использует отступы для распознавания структуры программы, требуется четкий способ идентификации идентификаторов. Это причина выбора пробелов или табуляции.
Тем не менее, Python также придерживается строгой философии, согласно которой есть только один способ сделать что-то, поэтому должна быть официальная рекомендация для одного способа сделать отступ.
И пробелы, и табуляции ставят перед редактором уникальные задачи, связанные с отступом. Обработка самих вкладок не одинакова для разных редакторов или даже пользовательских настроек. Поскольку пространства не конфигурируемы, они представляют более логичный выбор, поскольку они гарантируют, что результат будет выглядеть везде одинаково.
источник
Самое значительное преимущество, которое я могу сказать о пробелах над вкладками, состоит в том, что многие программисты и проекты используют заданное количество столбцов для исходного кода, и если кто-то фиксирует изменение, установив для табуляции 2 пробела, и проект использует 4 пробела в качестве табуляция длинных строк будет слишком длинной для окна редактора других людей. Я согласен, что с вкладками легче работать, но я думаю, что пространства легче для совместной работы, что важно в большом проекте с открытым исходным кодом, таком как Python.
источник
Вы можете съесть свой торт и съесть его. Настройте редактор для автоматического расширения вкладок в пробелы.
(Это было бы
:set expandtab
в Vim.)источник
Я предполагаю, что большинство текстовых редакторов Linux по умолчанию выглядят смехотворно большими. Я не могу придумать какой-либо другой веской причины использовать пробелы над вкладками.
источник
Помимо всех других уже названных причин (согласованность, никогда не смешивая пробелы и табуляции и т. Д.), Я считаю, что есть еще несколько причин, о которых следует помнить в соглашении о 4 пробелах. Это относится только к Python (и, возможно, к другим языкам, где отступ имеет значение). Вкладки могут быть лучше на других языках, в зависимости от индивидуальных предпочтений.
Если редактор не показывает вкладки (что случается, в зависимости от конфигурации, во многих случаях), другой автор может предположить, что ваш код использует 4 пробела, b / c почти весь код Python, доступный для общественности, делает; если у того же редактора ширина вкладки равна 4, могут произойти неприятные вещи - по крайней мере, этот бедняк потеряет время из-за проблемы с отступами, которую было бы очень легко избежать, придерживаясь соглашения. Поэтому для меня причина номер один - избегать ошибок в последовательности.
Переосмысливая вопрос о том, какие вкладки лучше, вкладки или пробелы, следует спросить, каковы преимущества вкладок; Я видел много постов, восхваляющих вкладки, но мало веских аргументов для них; хорошие редакторы, такие как emacs, vi (m), kate, ... делают правильные отступы в зависимости от семантики вашего кода - даже без вкладок; одни и те же редакторы могут быть легко настроены для удаления отступов в Backspace и т. д.
Некоторые люди имеют очень сильные предпочтения, когда речь заходит об их свободе в выборе внешнего вида / макета кода; другие ценят последовательность над этой свободой. Python резко уменьшает эту свободу, диктуя, что отступы используются для блоков и т. Д. Это может быть воспринято как ошибка или особенность, но вроде как при выборе Python. Лично мне нравится эта последовательность - когда начинаешь кодировать новый проект, по крайней мере, макет близок к тому, к которому я привык, поэтому его довольно легко читать. Почти всегда.
Использование пробелов для отступа допускает «уловки компоновки», которые могут облегчить понимание кода; некоторые примеры из них перечислены в PEP8; например.
Конечно, вышесказанное также можно записать как
Тем не менее, последний занимает больше строк кода, и иногда считается, что меньше строк лучше (так как вы получаете больше на одном экране). Но если вам нравится выравнивание, пробелы (желательно с помощью хорошего редактора) дают в некотором смысле большую свободу в Python, чем вкладки. [Ну, я думаю, что некоторые редакторы позволяют вам делать то же самое с вкладками;) - но с пробелами, все они делают ...]
Возвращаясь к тому же аргументу, что и все остальные - PEP 8 диктует (хорошо, настоятельно рекомендует) пробелы. Если вы приходите в проект, который использует только вкладки, конечно, у вас мало выбора. Но из-за установления соглашений PEP 8 почти все программисты Python привыкли к этому стилю. Это значительно упрощает поиск консенсуса по стилю, принятому большинством программистов ... и в противном случае согласие людей на стиль может быть очень сложным.
Инструменты, которые помогают реализовать стиль, обычно знают о PEP 8 без лишних усилий. Это не очень хорошая причина, но просто приятно, когда все работает прямо из коробки.
источник
Универсальная проблема с вкладками заключается в том, что они могут быть представлены по-разному в разных средах.
В данном редакторе вкладка может содержать 8 пробелов или может быть 2.
В некоторых редакторах вы можете управлять этим, а в других - нет.
Другая проблема с вкладками заключается в том, как они представлены в печатном виде. Я считаю, что большинство принтеров интерпретируют вкладку как 8 пробелов.
С пробелами сомнений нет. Все выстроится так, как задумал автор.
источник
О дискуссии между Джимом и Томасом Воутерсом в комментариях.
Проблема заключалась в том ... что ширина вкладок и пробелов могут различаться - и поскольку программисты не могут договориться ни о какой ширине - почему виноваты вкладки.
Я согласен с Джимом в этом - вкладки НЕ являются злом сами по себе. Но есть проблема...
С пробелами я могу контролировать, как «МОЙ СОБСТВЕННЫЙ КОД» выглядит в КАЖДОМ редакторе мира. Если я использую 4 пробела - тогда независимо от того, в каком редакторе вы открываете мой код, он будет иметь одинаковое расстояние от левого поля. С вкладками я в зависимости от настройки ширины вкладок для редактора - даже для МОЕГО СОБСТВЕННОГО КОДА. И мне это не нравится.
Поэтому, хотя это правда, что даже пробелы не могут гарантировать согласованность - они по крайней мере дают вам больше контроля над внешним видом вашего СОБСТВЕННОГО кода, чего не могут делать вкладки.
Я думаю, что это НЕ согласованность в программистах, пишущих код - но согласованность в редакторах, показывающих этот код - пробелы облегчают достижение (и навязывают).
источник