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

StackOverflow https://stackoverflow.com/questions/120926

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Если выразиться менее прямо:Учитывайте также объем PEP, указанный в самом первом абзаце:

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

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

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

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

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

Но если можно, я дам вам один совет:не путайте их ;-) [ред:Смешение табуляции и пробелов больше невозможно.]

Другие советы

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

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

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

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

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

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

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

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

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

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

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

В каждом приличном текстовом редакторе есть функция «замена табуляции пробелами», и многие ею пользуются.Но не всегда.

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

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

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

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

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

Однако, ИМХО, есть несколько второстепенных причин отдавать предпочтение пробелам перед вкладками:

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

«Для действительно старого кода, который вы не хотите испортить, вы можете продолжать использовать табуляцию с 8 пробелами».
Понятно, что есть НЕКОТОРЫЕ обстоятельства, когда можно использовать вкладки.

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

«Самый популярный способ создания отступов в Python — это использование только пробелов.Второй по популярности способ — только с вкладками».
Здесь ясно указано, что используются оба.Просто чтобы быть предельно ясным:Тем не менее, никогда не следует смешивать пробелы и табуляции в одном файле.

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


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

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

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

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

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

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

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

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

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

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

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

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

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

(Это было бы :set expandtab в Виме.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top