Вкладки и пробелы в программировании на Python - PullRequest
323 голосов
/ 23 сентября 2008

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

Как это меняет дело? Существуют ли другие причины, по которым в Python вместо пробелов можно использовать пробелы? Или это просто неправда?

Стоит ли сразу переключать мой редактор, чтобы вставлять пробелы вместо вкладок, или продолжать работать, как раньше?

Ответы [ 34 ]

4 голосов
/ 15 января 2014

В дополнение ко всем уже перечисленным аргументам я нахожу этот довольно важный (из Мифы об отступах ):

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

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

Аргумент для вкладок, который, казалось, еще никто не упомянул, состоит в том, что 1 вкладка - 1 символ (0x09, 1 байт в файле), а 4 пробела - 4 символа (4 раза 0x20, 4 байты в файле); таким образом, использование пробелов приводит к 4-кратной трате пространства.

Чтобы завершить этот непоследовательный список аргументов, я хотел бы привести ответ Тима Питерса в Выпуск 7012: Вкладки лучше, чем пробелы для отступа :

Стандарт Python "только для пробелов" предназначен для распределенный код. Многолетний опыт научил нас, что Вкладки вызывали бесконечные проблемы для общего кода (...)

3 голосов
/ 13 июля 2017

Это PEP 8 по состоянию на июль 2017 года:

Enter image description here

Кажется, это утверждение не оставляет места для другого выбора.

Но это не только то, что говорит нам PEP 8, несколькими строками позже:

Enter image description here

В приведенном выше примере первый оператор выражает предпочтение для пробелов, а второй оператор подтверждает существование кода с отступом от табуляции и это предпочтение для некоторых кодеров.

Итак : PEP 8 допускает отступы табуляции. Тем не менее, он не допускает смешивание табуляции и пробелов для отступа, что, поскольку само отступание обязательно, понятно.

Возможно, стоит упомянуть, что стиль кодирования Python от Google также следует правилу 4 пробелов.

Существуют и другие различные аргументы и обоснования в пользу табуляции или 4 пробелов.

Если вы работаете в компании, которая соблюдает PEP 8, или регулярно делитесь своим кодом с другими, которые следуют PEP 8, тогда здравый смысл диктует 4 пробела. Я (был, может быть) привык к вкладкам из C / C ++. Но при правильно установленной IDE разница становится минимальной.

3 голосов
/ 15 января 2016

Я полагаю, что есть решение, имеющее оба:

  1. Совместимость с PEP-8 и использованием пробелов
  2. Удобство использования табуляции вместо 4 пробелов

В Notepad ++ перейдите в «настройки» -> «Настройки вкладки» и выберите «Python» из списка справа. Затем убедитесь, что «размер вкладки: 4», и установите флажок «заменить [вкладка] на пробел». В этом случае вы можете просто использовать клавишу табуляции для отступа, но Notepad ++ фактически преобразует это в 4 пробела.

3 голосов
/ 05 марта 2015

Как это меняет дело?

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

Существуют ли другие причины, по которым вместо Python для Python следует использовать пробелы? Или это просто неправда?

Да, есть и другие веские причины, на которые указывают многие ответы до меня. «PEP-8» говорит так, однако, это НЕ одна из этих причин. Это происходит из самоутверждающегося мифа о том, что PEP-8 является стандартом кодирования для всего кода Python, хотя на самом деле это всего лишь стандарт кодирования для стандартного набора библиотек Python. Некоторые утверждают, что PEP-8 широко принят, а некоторые утверждают, что большинство программистов на Python используют пробелы вместо табуляции. Я хотел бы попросить доказательства этих утверждений, так как количество голосов на этом сайте Ясно показывает, что массы предпочитают вкладки. Мне очень жаль, что вы приняли «PEP8 так говорит» в качестве ответа на ваш вопрос, хотя на самом деле есть много других ответов, которые фактически объясняют относительные преимущества и недостатки пробелов и вкладок.

Стоит ли сразу переключать мой редактор, чтобы вставлять пробелы вместо вкладок, или продолжать работать, как раньше?

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

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

Так в какую ситуацию вы попадаете?

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

2 голосов
/ 27 августа 2018

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

Я открыл программное обеспечение Logitech, определил пару макросов для кнопок рядом с кнопкой вкладки, и проблема решена.

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

Видите, проверьте это: "" <- четыре пробела! Одним нажатием кнопки! Если бы я мог показать вам возвраты, я бы тоже это сделал. Приобретите клавиатуру Logitech G105, и все ваши проблемы исчезнут! </p>

2 голосов
/ 03 января 2018

Используйте пробелы вместо вкладок, по единственной причине, что вы заработаете больше денег:)

Ссылка: Разработчики, которые используют пробелы, зарабатывают больше денег, чем те, кто используют вкладки (сообщение в блоге Stack Overflow).

1 голос
/ 31 марта 2018

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

В качестве некоторых конкретных примеров рассматривается рендеринг строк документации Python во всплывающей подсказке в Код Visual Studio или в инструменте сравнения, таком как Beyond Compare или WinMerge , инструменты производительности или покрытия кода и т. д. В основном все эти различные другие инструменты взаимодействия могут иметь разные настройки для интерпретации вкладок, и это может раздражать и порой дезориентировать, чтобы находить вещи значительно отличающиеся или отталкивающиеся от экрана среди наборов инструментов, на которые вы можете погрузиться. вход и выход.

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

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

cmd_create_db = '''CREATE TABLE test (
    Col1 INTEGER,
    Col2 INTEGER,
    Col3 TEXT)'''

вы можете увидеть что-то вроде следующего (видно на встроенном терминале кода Visual Studio) ...

>>> cmd_create_db = '''CREATE TABLE test (
... .DS_StoreCol1 INTEGER,
... .DS_StoreCol2 INTEGER,
... .DS_StoreCol3 TEXT)'''
>>> cmd_create_db
'CREATE TABLE test (\n.DS_StoreCol1 INTEGER,\n.DS_StoreCol2 INTEGER,\n.DS_StoreCol3 TEXT)'

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

1 голос
/ 08 сентября 2016

Я люблю вкладки, но это как-то несовместимо с другим правилом, которое мне нравится: предел в 80 столбцов.

Если выбрать 4 пробела и вставить 10 табуляций, то останется место для 40 символов, чтобы выполнить ограничение в 80 столбцов. Если другой кодер предпочитает вкладки из 8 пробелов, эта же строка будет отображаться длиной 120 символов и не будет отображаться как допустимая строка из 80 столбцов!

Если вы хотите определить предел в 80 столбцов, то вам нужно выбрать длину для вкладки. В этом случае наличие пробелов x или табуляции длины x на самом деле не имеет значения.

Редактировать: связанный поток: Сохранение максимальной длины строки при использовании табуляции вместо пробелов?

1 голос
/ 02 ноября 2013

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

0 голосов
/ 14 июня 2018

Более неясный (для некоторых!) Аргумент со стороны вкладок: мне говорят, что вкладки лучше работают с программами чтения с экрана для слепых.

...