Ответ 1
Потому что PEP-8 говорит нам использовать пробелы.
Я всегда использовал вкладки для отступов, когда я занимаюсь программированием на Python. Но тут я столкнулся с вопросом здесь, где кто-то указал, что большинство программистов на Python используют пробелы вместо вкладок, чтобы свести к минимуму ошибки редактора-редактора.
Как это имеет значение? Существуют ли другие причины, по которым можно использовать пробелы вместо вкладок для Python? Или это просто не так?
Должен ли я переключать мой редактор, чтобы вставлять пробелы вместо вкладок сразу или продолжать движение, как я привык?
Потому что PEP-8 говорит нам использовать пробелы.
Устали от погони за опечатками отступа (8 пробелов? нет, 7 oops 9...) Я переключил свои источники на "только вкладки".
1 вкладка == 1 уровень отступа, полная остановка
Точка: если вы хотите отображать отступ в виде ширины 4, 8 или pi/12, просто измените настройки в текстовом редакторе, не путайте с кодом.
(Лично я использую вкладку ширины 4 char... но некоторые предпочли бы 3 или 8 пробелов или даже использовали шрифты с переменной шириной.)
Так говорил Господь: ты должен иметь отступы с четырьмя местами. Не больше, не меньше. Четверо - это количество пространств, которое вы должны отступать, и число отступов вашего будет четыре. Восемь вам не будет отступать, ни отступать от вас, кроме того, что тогда вы переходите к четырем. Вкладки сразу. - Георг Брандл
ИСПОЛЬЗУЙТЕ РЕДАКТОР, КОТОРЫЙ ОТОБРАЖАЕТ ТАБЛИЦЫ ХАРАКТЕРОВ (все пробелы, если на то пошло). Вы программируете, а не пишете статью.
Я использую вкладки. Там нет места для однопространственной ошибки на вкладках (если вы можете их увидеть). Проблема заключается в том, что люди используют разные редакторы, и единственная распространенная вещь в мире: tab == indent, как указано выше. Некоторый парень приходит с клавишей табуляции, установленной на неправильное количество пробелов, или делает это вручную и создает беспорядок. TAB и использовать реальный редактор. (Это не просто противоречит PEP, но и о C/С++ и других языках с пробелами-агностиками).
/отходит от soapbox
Моя основная причина использования вкладок над пробелами - это ключ backspace. Если я нахожусь на линии, и я хочу backspace - удалите отступ только на одной строке, я должен нажать backspace 4x, если это пробелы; тогда как мне нужно только ударить его один раз, если это вкладка.
Я буду продолжать использовать вкладки, потому что, как было сказано ранее, проще конвертировать из вкладок в пробелы, но не наоборот.
Я думаю, что хочу написать простую программу, которая преобразует код с пробелами в код с вкладками, потому что я занимаю пространство ненависти. Они подталкивают меня к стене!
Ой! И использование клавиш со стрелками для навигации влево и вправо всегда является болью в заднице, когда она пробегает.
UPDATE: Sublime Text 3 теперь удаляет полную мягкую вкладку с помощью клавиши backspace; хотя навигационная клавиша со стрелкой все еще утомительна.
UPDATE: теперь я использую vscode, а также написал расширение TabSanity для его решения по обратному пространству, удалению и навигации по стрелке.
Самый "питонический" способ - использовать 4 пробела на уровне отступа. Однако интерпретатор Python распознает пробелы или вкладки. Единственный gottcha - вы никогда не должны смешивать пробелы и вкладки, выбирать один или другой. Тем не менее, спецификация рекомендует пробелы, большинство разработчиков используют пробелы, поэтому, если у вас нет по-настоящему веской причины, я бы сказал, что нужно идти с пробелами.
Насколько я могу судить, вот плюсы и минусы табуляции против пробелов.
Плюсы вкладок:
Минусы вкладок:
Есть некоторые проблемы, которые некоторые люди игнорируют:
Вы можете получить пробелы в отступах с вкладками, которые испортят все: практически все IDE/редакторы поддерживают визуализацию пробелов, и почти так же вероятно, что вы получите пробелы в отступах! В любом случае, я не вижу в этом частой ошибки. Кроме того, большинство ошибок отступов будет поймано Python, и хорошие IDE должны быть в состоянии выделить различные отступы.
Вы не можете легко выровнять вещи с помощью табуляции: это верно, если вы собираетесь выровнять персонажа безупречно, но PEP-8 рекомендует против этого, и Python все равно не очень хорошо работает с многострочными операторами.
У людей есть разные настройки размера отображения вкладок в их редакторах, поэтому ваш код будет выглядеть по-разному в разных местах: да, это действительно полезная функция вкладок.
Я начал использовать пробелы, чтобы быть совместимым с другим кодом Python, но, честно говоря, это достаточно разочаровывает, что я, вероятно, вернусь к вкладкам. Многое зависит от возможностей вашей IDE, но, по моему опыту, никакая поддержка IDE для отступов в пространстве не так хороша, как просто использование вкладок.
Поэтому, если вам действительно не нравится быть несовместимым с большинством (предположительно, не со всем!) Кода Python, используйте вкладки и включите визуализацию пробелов и выделение отступов (если доступно). Самая главная причина для меня - это легкость выбора и (довольно значительное ИМО) уменьшение количества нажатий клавиш. Некоторые соглашения глупы.
Обновление: я обнаружил, что во всем мире есть один редактор (исключая глупости, такие как Vim), который правильно поддерживает пробелы как отступы: Atom. У него есть опция под названием "атомарные табуляции", которая заставляет 4 пробела вести себя так, как если бы это была вкладка во всех отношениях (кроме возможности изменить ее размер). К сожалению, Atom довольно медленный и раздутый редактор, но это отличная возможность, и если вы вынуждены использовать пробелы, это может быть хорошим вариантом. Надеюсь, однажды другие редакторы начнут поддерживать его. Здесь проблема для VSCode.
Недавно я наткнулся на статью под названием Python: Myths about Indentation, в которой обсуждаются эти и связанные вопросы. В статье есть веские причины рекомендовать использование пространств при написании кода Python, но есть определенная возможность для разногласий.
Я верю, что большинство программистов на Python используют только пробелы.
Используйте редактор, который позволяет вставлять пробелы в табло, когда вы нажимаете клавишу TAB, вместо того, чтобы вставлять символ \t. И затем забудьте об этом.
Вы можете смешивать вкладки и пробелы... НО табуляция считается тем же самым отступом, что и 8 пробелов, поэтому, если ваш редактор не настроен, чтобы рассмотреть вкладку на 8 пробелов, которые вы просите о проблемах при их смешивании.
Единственное неудобство, которое я испытываю при использовании пробелов вместо вкладок, заключается в том, что вы не можете легко удалить уровень отступов; вам нужно удалить четыре пробела вместо одной вкладки.
Правило вкладок. Тот же аргумент для вложенных циклов, и вы хотите, чтобы внешний контур "вернулся" на 1 уровень. Совет. Если вы хотите преобразовать старый пробельный код python в вкладки, используйте утилиту TabOut, доступную как исполняемый файл на http://www.textpad.com/add-ons/.
Я очень сильно чувствую, что независимо от исторической конвенции вкладки - это просто лучший выбор и должны заменять пробелы в каждой будущей строке написанного кода Python. Как выгнать некомпетентного тирана. Мое обоснование для этого: простота как основная ценность. Используйте два или четыре символа для семантической задачи одного? Там нет оправдания за пределами традиции, ИМО.
Когда я впервые изучал Python, меня немного отвлекла идея значительного пробела, так как большинство языков, чтобы использовать его, были негибкими. Тем не менее, я был впечатлен способностью Python понимать различные стили отступа. Рассматривая, какой стиль использовать для нового проекта, я думаю, важно помнить две вещи.
В принципе, существует переменная (которая может быть изменена путем включения комментария вверху исходного файла # tab-width:), который определяет ширину табуляции. Когда Python встречает вкладку, она увеличивает расстояние отступа до следующего кратного ширины табуляции. Таким образом, если в левой части файла вводится пробел, за которым следует вкладка, следующий кратный ширины табуляции равен 8. Если вкладка сама по себе вводится, происходит то же самое.
Таким образом, безопасно, если ваш редактор настроен правильно, использовать вкладки и даже смешивать вкладки и пробелы. До тех пор, пока вы устанавливаете стопку вкладки редактора на ту же ширину, что и декларация ширины табуляции Python (или 8, если она отсутствует). Как правило, плохая идея использовать редактор с шириной табуляции, отличной от 8 пробелов, если вы не укажете ширину табуляции в файле.
Я столкнулся с проектами, которые успешно используют сочетание вкладок и пробелов. В основном пробелы используются для отступов небольших разделов, где факт, что он находится в отступом, относительно неважен; в то время как вкладки используются для привлечения внимания читателя к большому структурному признаку. Например, классы начинаются с вкладки, в которой простые условные проверки внутри функции используют два пробела.
Вкладки также полезны при работе с большими блоками текста с отступом нескольких уровней. Когда вы выходите из 3-4 уровней отступов, гораздо проще выстроить правильную вкладку, чем соответствовать правильному количеству пробелов. Если проект не использует рекомендуемый стиль PEP 8, вероятно, лучше всего написать руководство по стилю в файл где-нибудь, чтобы шаблон отступов оставался согласованным, а другие люди могли явно читать, как настроить их редактор для соответствия.
Кроме того, Python 2.x имеет возможность -t
выдавать предупреждения о смешанных вкладках и -tt
и -tt
для выдачи ошибки. Это применимо только к смешанным вкладкам и пространствам внутри одной и той же области. Python 3 предполагает -tt
и, насколько я понял, нет возможности отключить эту проверку.
Ошибка редактора-редактора возникает, когда у вас смешанный отступ внутри файла. Это возникает следующим образом: блок кода имеет отступы с 4 пробелами, а затем один уровень отступов "в", он имеет отступы с вкладками. Теперь язычник, который сделал это (смешение вкладок и пробелов), сделал это так, чтобы его вкладки были также 4 пробелами, поэтому он не видит проблем, и Python не видит проблем.
Теперь наша жертва приходит позже, и у него есть свои вкладки в 8 пробелов. Теперь наши жертвы считают, что код выглядит все взломанным и исправляет его, удаляя один уровень отступов, который теперь делает код похожим на то, что он все еще является 2 уровнями отступов, но на самом деле один уровень. В этот момент все ад разрывается.
Урок здесь заключается в том, что вы никогда не должны смешивать вкладки и пробелы. Если вы придерживаетесь этого, тогда легко добавить код в пробелы или вкладки, независимо от того, что вы лично используете. Лучший способ убедиться, что вы не смешиваете вкладки и пробелы, - это всегда запускать python
с -tt
, что приведет к ошибке при -tt
вкладок и пробелов.
Что касается вкладок и пробелов, я лично использую вкладки с таким отдельным отступом от внешнего вида - гораздо проще изменить внешний вид кода, когда он имеет отступы с вкладками, чем с пробелами. Я знаю, что это противоречит тому, что делают 99% программистов на Python, но это мои личные предпочтения, и в любом случае легко конвертировать файл с вкладками в разнесенный. Обратное не всегда верно, так как вы можете случайно удалять 4 пробела в строках и т.д.
Я в первую очередь программист на С++, но иногда мои проекты включают небольшое количество Python. Я использую вкладки для ввода моего кода на С++. Это означает, что у меня есть три варианта:
Для моих проектов я обычно выбираю вариант 3.
Опыт и PEP-8 ясно показывают, что пространства смешивания и TAB
следует избегать.
Если вы хотите их смешивать, вы должны визуализировать пробелы в среде IDE, но тогда вы теряете преимущество видимых областей отпечатка Python. Визуализация пробелов в среде IDE загромождает дисплей.
Если это пробелы TAB или, то это должно быть пробелы по простой причине: можно переключить почти все IDE и текстовые редакторы, чтобы автоматически заменить вкладки пробелами, но противоположное неверно.
Несмотря на то, что есть IDE, которые могут автоматически преобразовывать ведущие пробелы в строке на вкладки, это в конечном итоге приведет к смешению вкладок и пробелов. Рассмотрим многострочные операторы, такие как вызовы функций с большим количеством параметров или строк документа. В то время как "ascii-art" также следует избегать, это может случайно произойти случайно, что после первых вкладок осталось одно пространство.
Другие ответы привели несколько аргументов в пользу вкладок:
TAB
более эффективно. Конечно, это верно, но все текстовые редакторы позволяют сразу вставить нужное количество пробелов при нажатии клавиши табуляции.TAB
. Проблема заключается в взаимодействии с другими людьми и/или командами. Чтобы это работало в реальном мире, всем приходилось согласовывать все, используя только TAB
. Так как этого не произошло, оно все равно не работает. В сценарии реального мира есть набор правил кодирования, которые в любом случае согласуются с проектом, и метод отступов, безусловно, один из них - даже на других языках программирования, где последствия "только" на визуальном уровне.Imho, главное, что большинство (если не всех) ответов отсутствует здесь, - это взаимодействие между командами или отдельными лицами, особенно в сценариях, где список участников не знает в начале. Когда код соответствует коду, либо все должны использовать вкладки, либо все должны использовать пробелы. Его нельзя смешивать, не вдаваясь в проблемы с функциональностью. Люди не идеальны. Инструменты не идеальны. Вот почему imho мы не должны использовать TAB
вообще.
Нет ответа без ссылки, которую Greg предоставил в своем ответе: Python: Мифы об отстуке
У всех разные предпочтения в отношении того, сколько кода должно быть отступом. Скажем, вы делитесь кодом с кем-то, и он или она имеет разные предпочтения в отношении отступов. Если отступы находятся на вкладках, ваш друг всегда может просто изменить ширину вкладки в настройках редактора. Однако, если отступы находятся в пробелах, вашему другу действительно придется изменить исходный код, если он или она захочет установить его по своему усмотрению. Затем, когда вы получите изменения своего друга, вы можете изменить его на свое предпочтение. В этом случае вам придется либо иметь дело с утомительным изменением уровней отступов вперед и назад, либо один человек должен принять другие предпочтения в уровне отступов. Если вы и ваш друг используете вкладки, то факт, что у вас разные настройки, не является проблемой, так как каждый из них может видеть разные уровни отступов, в то время как код остается неизменным. Вот почему, на мой взгляд, вкладки лучше, чем пробелы для отступов на всех языках программирования.
Существует сценарий, в котором вкладки просто не работают, а именно: в зависимости от используемого стиля кодирования вам может потребоваться отложить некоторые строки кода до одномерной точности, т.е.
def foobar():
x = some_call(arg1,
arg2)
В этом случае использование чисто вкладок не будет работать вообще; использование вкладок для основного отступа и пробелов для под-отступа будет работать, но будет нарушать жесткое правило не смешивать два.
Однако это не будет иметь место при использовании документа стиля/условных обозначений кодирования, который позволяет избежать ситуаций, подобных приведенному выше примеру кода.
В дополнение ко всем приведенным аргументам я считаю это достаточно важным (из Мифы о отступе):
Кроме того, вкладки часто уничтожаются или неправильно преобразуются во время операций копирования и вставки или когда часть исходного кода вставляется в веб-страницу или другой код разметки.
Другой аргумент (особенно привязанный к среде, хотя) против вкладок состоит в том, что они иногда отсутствуют на клавиатурах телефонов. Вероятно, это можно было бы исправить, установив альтернативную клавиатуру, где это возможно.
Аргументы для, о которых никто, казалось, еще не упомянул, состоит в том, что 1 вкладка - 1 символ (0x09, 1 байт в файле), а 4 пробела - 4 символа (4 раза 0x20, 4 байта в файле); таким образом, использование пробелов приводит к 4-кратной трате пространства.
Чтобы завершить этот бессвязный список аргументов, я хотел бы привести Тим Петерс в ответ на Issue 7012: вкладки лучше, чем пробелы для отступа:
Стандарт "пространства только для Python" предназначен для распределенный код. Годы раннего опыта научили нас сомневаться в том, что вкладки вызвали бесконечные проблемы для общего кода (...)
Это PEP 8 по состоянию на июль 2017 года:
Кажется, это выражение не оставляет места для любого другого выбора.
Но это не только то, что нам говорит PEP 8, несколько строк позже:
В приведенном выше примере первый оператор выражает предпочтение пробелам, а второй оператор подтверждает существование кода с отступом с вкладками и этим предпочтением для некоторых кодеров.
Итак: PEP 8 является толерантным отступом табуляции. Он не допускает смешения таблиц и пробелов для отступов, хотя, поскольку отступы сами по себе являются обязательными, понятно.
Возможно, стоит упомянуть, что стиль кодирования Google Python также следует за правилом с четырьмя пробелами.
Существуют и другие аргументы и обоснования в пользу вкладок или четырехмерных пространств.
Если вы работаете в компании, которая обеспечивает соблюдение PEP 8, или регулярно делитесь своим кодом с другими людьми, которые следуют за PEP 8, тогда здравый смысл диктует 4-пространство. Я (возможно, был) использован для вкладок из C/C++. Но с правильно установленной IDE разница становится минимальной.
Проблема с использованием пробелов вместо вкладок - размер файла становится настолько невероятно большим. Например, файл с пространственно-отступом размером 500 КБ может быть уменьшен до 200 кб при замене пробелов для вкладок, поэтому я всегда использую вкладки.
Меньший размер файла означает более быструю загрузку, компиляцию, выполнение (в некоторых случаях) и т.д.
Для меня нет смысла использовать пробелы, но если кто-то использует редактор, который имеет проблемы с вкладками, то они могут заменить "\ t" на "" или "" или что-то еще..
Используйте пробелы вместо вкладок, потому что вы сделаете больше денег :)
Ref.: Разработчики, которые используют пространства, зарабатывают больше денег, чем те, кто использует вкладки (сообщение о переполнении стека).
Как это имеет значение?
Некоторые редакторы по умолчанию настроены на замену одного символа табуляции на заданное количество символов пробела, но некоторые из них не являются. Если каждый использует пробелы, эту разницу в настройках редактора по умолчанию можно игнорировать.
Существуют ли другие причины, по которым можно использовать пробелы вместо вкладок для Python? Или это просто неправда?
Да, есть другие веские причины, о которых говорили многие ответы передо мной. Однако "PEP-8" говорит, что это НЕ одна из этих причин. Это происходит из самовоспроизводящегося мифа о том, что PEP-8 является стандартом кодирования для всего кода Python, когда на самом деле это всего лишь стандарт кодирования для стандартного набора библиотек Python. Некоторые утверждают, что PEP-8 широко принят, а некоторые утверждают, что большинство программистов на Python используют пробелы вместо вкладок. Я хотел бы попросить доказательства этих претензий, поскольку количество голосов на этом сайте ЧИСТОЕ показывает, что вкладки предпочитаются массами. Мне очень жаль, что вы приняли "PEP8 говорит так", как ответ на ваш вопрос, когда на самом деле есть много других ответов, которые фактически объясняют относительные преимущества и недостатки пробелов и вкладок.
Должен ли я переключать свой редактор, чтобы сразу вставлять пробелы вместо вкладок или продолжать идти, как я привык?
Это зависит, и ответ на этот последний вопрос заключается в том, где я думал, что могу добавить некоторую ценность в этот поток. ИМХО, независимо от используемого языка, лучший используемый стандарт кодирования зависит от ситуации, в которой вы находитесь:
Так в какой ситуации вы попадаете?
Наконец, чтобы упростить мою позицию, для моих собственных сольных проектов я использую вкладки, потому что вкладки имеют больше смысла для меня, и я более продуктивен с вкладками.
Я считаю, что есть решение:
В Notepad++ перейдите в "Настройки" → "Настройки вкладки" и выберите "Python" из списка справа. Затем убедитесь, что "размер вкладки: 4", и установите флажок "заменить [вкладку] пробелом". В этом случае вы можете просто использовать клавишу табуляции для отступов, но Notepad++ фактически преобразует это в 4 пространства для вас.
Итак, здесь я читаю все ответы и задаюсь вопросом, как я могу выполнить PEP-8 без раздражения, чтобы многократно стучать по моей обратной стороне, чтобы удалить отступ, и я смотрю на свою игровую клавиатуру Logitech со всеми ее причудливыми макрокомандами и светом лампочка загорается в моей голове. Открытое программное обеспечение logitech, определило пару макросов для кнопок рядом с кнопкой вкладки, и проблема решена. Одна кнопка добавляет четыре пробела, другая - четыре раза. Удивительно. Просто великолепно. Так легко попасть в кнопки с моим мизинцем. Смотрите, проверьте это: "" <- четыре пробела! Одним нажатием кнопки! Если бы я мог показать вам пробелы, я тоже это сделаю. Идите, возьмите клавиатуру Logitech G105, и все ваши проблемы исчезнут!
Я только начинаю, но мне гораздо проще использовать вкладки, чем пробелы, и не понимаю, как использовать PEP-8 только пробелы. Sublime Text 2 отлично справляется с визуализацией вкладок с нечеткой вертикальной, пунктирной линией, и, хотя есть случаи, когда я смешиваю пространство или два, чтобы выстроить элементы списка или словаря, я не испытывал ситуации, когда это быть вредным.
Мне нравятся вкладки, но это как-то несовместимо с другим правилом, которое мне нравится: предел в 80 столбцов.
Если вы выбираете 4 пробела и вставляете 10 вкладок, то для выполнения 80-ти столбцов для пробела осталось 40 символов. Если другой кодер предпочитает 8 пробелов, одна и та же строка будет отображаться в виде 120 символов и не будет отображаться как допустимая строка из 80 столбцов!
Если вы хотите определить предел в 80 столбцов, вам нужно выбрать длину для вкладки. В этом случае наличие x пробелов или вкладка длины x на самом деле не имеет значения.
Изменить: связанный поток: Поддержание максимальной длины строки при использовании вкладок вместо пространств?
Я думаю, что одним из основных преимуществ использования пробелов является то, что вы удаляете изменчивость в том, как ваш исходный код визуализируется во множестве внешних инструментов, которые должны взаимодействовать с источником за пределами одного редактора выбора и любых параметров, в которые они настроили его.
В качестве некоторых конкретных примеров рассмотрим рендеринг докстронтов Python во всплывающей подсказке в Visual Studio Code или в инструменте diff, таком как Beyond Compare или WinMerge, инструментах для обеспечения производительности или кода и т.д. В принципе, все эти различные другие инструменты сопряжения могут иметь разные настройки для как интерпретируются вкладки, и это может раздражать и порой дезориентировать, чтобы найти вещи, совершенно разные или оттолкнутые от экрана среди инструментов, которые вы можете погружать и выходить из.
В двух словах вы определяете выравнивание в источнике, а не разрешаете единообразную конфигурацию набора инструментов в вашем арсенале. Пространства строго интерпретируются в моноширинном шрифте, чтобы обеспечить надежное и согласованное выравнивание по всему спектру инструментов из-за определения шрифта, а не стороннюю вкладку, отображающую реализацию/конфигурацию.
Другим поводом для этого является копирование исходного источника вкладок для запуска на терминале, где символ табуляции может инициировать завершение незавершенной табуляции. Например, если вы скопируете следующий источник Python (вкладки, используемые как отступы)
cmd_create_db = '''CREATE TABLE test (
Col1 INTEGER,
Col2 INTEGER,
Col3 TEXT)'''
вы можете увидеть что-то вроде следующего (см. встроенный терминал Visual Studio Code)...
>>> 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)'
(Кроме того: я задавался вопросом, является ли это наблюдение за согласованностью между инструментами знаками различного ума резкого разработчика, желающего упорядочить мир, который может указывать на разницу в зарплате, найденную в Stack Overflow.)
Люди будут использовать разные редакторы по одному и тому же коду. Эти редакторы будут отображать вкладку на экране по-разному. Если вы работаете над редактором, который представляет вкладку в виде 4 пробелов, если вы отступаете в первой строке "\t "
а второй - "\t\t"
, они будут выглядеть так, как будто они находятся в одном и том же отступе уровень: 8 пробелов.
Интерпретатор Python не знает вашего редактора, и он должен интерпретировать вкладку как некоторое количество отступов. Фактически, он интерпретирует вкладку как 8 пробелов, поэтому он будет видеть разные уровни отступа, чем то, что вы намеревались: 12 пробелов для первой строки, 16 пробелов для второго. Ты поджарен.