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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Тем не менее, IMHO существует несколько незначительных причин в пользу пробелов над вкладками:

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

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

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

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

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

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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


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

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

'Для действительно старого кода, который вы не хотите испортить, вы можете продолжать использовать вкладки с 8 пробелами.'
Ясно, что есть некоторые обстоятельства, при которых могут использоваться табуляции.

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

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

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


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

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

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

Ответ 9

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

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

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

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

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

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

  • Использование пробелов для отступов позволяет "макетные трюки", которые могут облегчить понимание кода; некоторые примеры из них перечислены в 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"}
    

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

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

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

Ответ 15

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

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

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

Ответ 16

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

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

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

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

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

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