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


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

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

16 128

16 ответов:

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

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

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

говоря менее прямо: рассмотрим также сферу применения ОПТОСОЗ, как указано в самом первом абзаце:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


примечания по PEP-8

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. некоторые люди имеют очень сильные предпочтения, когда дело доходит до их свободы в решении внешнего вида/ макета кода; другие ценят последовательность над этой свободой. Питон резко снижает эту свободу, диктуя, что отступ используется для блоков и т. д. Это может рассматриваться как ошибка или функция, но это своего рода поставляется с выбором 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"}
    

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

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

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

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

еще одна проблема с вкладками-это то, как они представлены в печатном виде. Я считаю, что большинство принтеров интерпретируют вкладку как 8 пробелов.

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

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

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

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

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

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

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