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

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

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

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

Ответы [ 34 ]

12 голосов
/ 23 сентября 2008

Вы МОЖЕТЕ смешивать символы табуляции и пробелы ... НО вкладка считается с тем же отступом, что и 8 пробелов, поэтому, если ваш редактор не настроен для того, чтобы считать вкладку 8 пробелами, вы сталкиваетесь с трудностями при их смешивании. .

11 голосов
/ 25 октября 2011

Правило вкладок. Тот же аргумент для вложенных циклов, и вы хотите вернуть внешний цикл "назад" на 1 уровень. Совет: Если вы хотите преобразовать старый код Python, пронизанный пробелами, во вкладки, используйте утилиту TabOut, доступную как исполняемый файл на http://www.textpad.com/add-ons/.

11 голосов
/ 17 апреля 2016

Я чувствую, что независимо от исторического соглашения, вкладки - просто лучший выбор и должны заменять пробелы в каждой будущей строке написанного кода Python. Как выгнать некомпетентного тирана. Мое обоснование для этого: Упрощение в качестве основного значения . Использовать два или, может быть, четыре символа для семантического задания одного? Там нет оправдания вне традиции, ИМО.

8 голосов
/ 15 октября 2011

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

  1. Во-первых, важно понять, как Python интерпретирует отступы. Брайан Оукли упомянул о возможности появления отдельных ошибок при использовании вкладок, но на самом деле это невозможно при настройках интерпретатора по умолчанию. Это можно лучше объяснить в Learning Python , из O'Reilly Media .

По сути, есть переменная (которую можно изменить, добавив комментарий вверху исходного файла # tab-width:), которая определяет ширину вкладки. Когда Python встречает вкладку, он увеличивает расстояние отступа до следующего кратного ширины табуляции . Таким образом, если в левой части файла вводится пробел, за которым следует табуляция, следующая кратность ширины табуляции равна 8. Если вводится табуляция сама по себе, происходит то же самое.

Таким образом, при правильной настройке редактора безопасно использовать вкладки и даже смешивать вкладки и пробелы. До тех пор, пока вы устанавливаете вкладку вашего редактора на ширину табуляции, равную объявлению ширины табуляции Python (или 8, если она отсутствует). Как правило, плохая идея использовать редактор с шириной табуляции, отличной от 8 пробелов, если вы не укажете ширину табуляции в файле.

  1. Во-вторых, большая часть синтаксического дизайна Python состоит в том, чтобы поощрять читаемость кода и согласованный стиль между программистами в одном проекте. Тем не менее, для любого конкретного проекта возникает вопрос, что сделает код наиболее читаемым для людей, работающих над проектом . Конечно, это хорошая идея, чтобы сохранить согласованный стиль отступов, но в зависимости от платформы и редактора, используемого проектом, для разных проектов может иметь смысл различный стиль. Если нет веских причин для несоблюдения PEP 8 , тогда имеет смысл это сделать, поскольку оно будет соответствовать ожиданиям людей.

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

Вкладки также полезны при работе с большими блоками текста с отступом на несколько уровней. Когда вы пропускаете 3-4 уровня отступа, гораздо проще выстроить правильную вкладку, чем выровнять нужное количество пробелов. Если в проекте не используется рекомендуемый стиль PEP 8, вероятно, лучше всего написать руководство по стилю в файле где-нибудь, чтобы шаблон отступа оставался непротиворечивым, а другие могли явно прочитать, как настроить свой редактор для соответствия.

Кроме того, в Python 2.x есть опция -t для выдачи предупреждений о смешанных символах табуляции и пробелах и -tt для выдачи ошибки. Это относится только к смешанным символам табуляции и пробелам внутри одной области видимости. Python 3 предполагает -tt, и, насколько я обнаружил, нет возможности отключить эту проверку.

8 голосов
/ 23 сентября 2008

Ошибка редактора для редактора возникает, когда у вас есть смешанный отступ в файле . Это происходит следующим образом: блок кода имеет отступ с 4 пробелами, а затем один уровень отступа «in», с отступом табуляции. Теперь у язычника, который сделал это (смешивание табуляции и пробелов), было так, что его табуляция также была 4 пробелами, поэтому он не видит проблем, а Python не видит проблем.

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

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

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

7 голосов
/ 29 ноября 2011

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

  1. Используйте вкладки в C ++ и пробелы в Python. Это позволяет моим файлам C ++ оставаться такими, как они есть, и я следую рекомендации PEP-8, но я не согласен с моим проектом.
  2. Измените мой код C ++, чтобы использовать пробелы. Это позволяет согласовать все мои файлы в моем проекте, и я следую рекомендации PEP-8, но требует, чтобы я вернулся и изменил все свои файлы C ++. Я считаю, что это плохо, потому что я предпочитаю вкладки.
  3. Используйте вкладки в моем коде C ++ и коде Python. Это делает весь мой проект непротиворечивым и позволяет мне использовать предпочитаемый стиль отступов: вкладки. Недостатком является то, что я не следую стандарту PEP-8.

Для моих проектов я обычно использую вариант 3.

7 голосов
/ 03 июля 2013

Опыт и PEP-8 , оба четко заключают, что следует избегать мест смешения и TAB s. Если вы хотите смешать их, вы должны визуализировать пробелы в IDE - но тогда вы потеряете преимущество отступов Python, делающих области видимости легко видимыми. Визуализация пробелов в IDE загромождает дисплей.

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

Несмотря на то, что существуют интегрированные среды разработки, которые могут автоматически преобразовывать начальные пробелы в строке во вкладки, это в конечном итоге приведет к сочетанию вкладок и пробелов. Рассмотрим многострочные операторы, такие как вызовы функций с большим количеством параметров или строк документации. Хотя «ascii-art» также следует избегать, может легко случиться так, что после первых вкладок останется один пробел.

Другие ответы привели несколько аргументов в пользу вкладок:

  • Удар TAB эффективнее. Конечно, это правда, но все текстовые редакторы позволяют сразу вставлять требуемое количество пробелов при нажатии клавиши табуляции
  • Отступы / Отступы проще, когда нужно просто удалить одну вкладку вместо 2/3/4/8 пробелов. Да, но большинство текстовых редакторов в любом случае позволяют делать это автоматически: выбор блока, отступ / отступ - основные функции редактора программирования, такие как комментирование / снятие комментария. Если в текстовом редакторе это не реализовано, он должен, по крайней мере, иметь простую в использовании функциональность макросов, с помощью которой можно достичь того же.
  • Разные программисты любят разные ширины отступа. Это правда, и явное преимущество использования только TAB s. Проблема заключается во взаимодействии с другими людьми и / или командами. Чтобы это работало в реальном мире, каждый должен был бы согласиться на все, используя только TAB s. Так как этого не произошло, оно все равно не работает. В сценарии реального мира есть ряд рекомендаций по кодированию, с которыми проект все равно соглашается, и метод отступа, безусловно, является одним из них - даже в других языках программирования, где последствия «только» на визуальном уровне.

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

Ни один ответ не будет полным без ссылки, которую Грэг предоставил в своем ответе уже: Python: Мифы об отступах

6 голосов
/ 11 июня 2011

У каждого разные предпочтения относительно того, сколько кода должно быть с отступом. Допустим, вы делитесь кодом с кем-то, и у него или ее есть разные предпочтения относительно отступов. Если отступы находятся на вкладках, ваш друг всегда может просто изменить ширину вкладки в настройках своего редактора. Однако, если отступы в пробелах, вашему другу на самом деле придется изменить исходный код, если он или она хочет установить его по своему усмотрению. Затем, когда вы получите изменения вашего друга, вы можете принять решение изменить его обратно по своему вкусу. В этом случае вам придется либо иметь дело с скукой изменения уровней отступа взад и вперед, либо один человек должен принять предпочтения другого в уровне отступа. Если и вы, и ваш друг используете вкладки, тот факт, что у вас разные предпочтения, не является проблемой, поскольку каждый из вас может видеть разные уровни отступов, в то время как код остается неизменным. Вот почему, на мой взгляд, вкладки лучше, чем пробелы для отступов во всех языках программирования.

5 голосов
/ 02 марта 2012

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

def foobar():
    x = some_call(arg1,
                  arg2)

В этом случае использование чисто вкладок не будет работать вообще; использование вкладок для основного отступа и пробелов для вспомогательного отступа будет работать, но нарушит жесткое правило не смешивать два.

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

5 голосов
/ 13 сентября 2017

Проблема с использованием пробелов вместо вкладок заключается в том, что размер файла становится невероятно большим ... Например, файл с отступом в 500 КБ может быть уменьшен до 200 КБ при замене пробелов для вкладок, поэтому я всегда использую вкладки .

Меньший размер файла означает более быструю загрузку, компиляцию, выполнение (в некоторых случаях) и т. Д.

Для меня нет смысла использовать пробелы, но если кто-то использует редактор, у которого есть проблемы с вкладками, он может заменить "\ t" на "" или "" или что-то еще ...

...