Python табуляция (отступы)

Одна из особенностей Python – для оформления блоков кода вместо привычных фигурных скобок, как в C, C ++, Java или операторных скобок begin … end как в Pascal, используются отступы или табуляция. Какие есть правила их расстановки – рассмотрим далее.

Почему табуляция в Питоне так важна?

Что такое отступ? Говоря простыми словами, это просто добавление пробела перед определенным оператором.

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

Многим программистам жесткое соблюдение отступов может показаться избыточной мерой. Однако именно из-за строго соблюдения правил форматирования, код на Python – чистый, понятный и аккуратный. Отсюда следующие плюсы 👍:

  • Не нужно проверять, не потерялась ли лишняя скобка;
  • Читать такой код удобнее (по "Философии Python" – читаемость имеет значение);
  • Легче работать со сторонними библиотеками;
  • Код вашего коллеги будет максимально похож на ваш код;

💁‍♂️ Чтобы понять, насколько это важно, можно представить ситуацию, когда в книге удалить все номера страниц, в результате чего нельзя будет понять, где продолжать чтение. Без использования indent-отступа интерпретатор Python не сможет определить, какой оператор необходимо выполнять следующим, что относится к разным блокам кода. В результате и возникает исключение типа IndentationError .

Отступы в языке Python – это способ указать интерпретатору, что оператор (или целая их группа) – это определенный block-комбинация команд для выполнения задачи.

В большинстве других языков, таких как семейство C, Java и прочих для оформления блоков используются фигурные скобки, в Питоне – отступы, для создания которых обычно используются пробелы. Все команды, отделенные от начала строки одним и тем же расстоянием, принадлежат к одному и тому же блоку. Если в нем выделяется еще один блок – используется еще один отступ вправо, и так далее. Рассмотрим это на примере:

def my_small_function(): # [0 пробелов] определение функции со знаком «:» в конце if a > b: # [4 пробела] начало блока условия, располагается внутри функции return a # [8 пробелов] часть блока if else: # [4 пробела] продолжение блока условия, на том же уровне, что и if return b # [8 пробелов] часть блока else print(my_small_function()) # [0 пробелов] вызов функции вне ее блока

💡 По умолчанию в Python используется 4 пробела в качестве отступа

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

Что нам говорит PEP8?

Для каждого уровня отступов необходимо использовать по 4 пробела.

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

Примеры кода

👍 Правильное оформление

# Выравнивание выполнено по открывающей скобке foo = name_of_function(one, two, three, four) # Дополнительные отступы используются для выделения блока от остальных def name_of_function( one, two, three, four): print(one)

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

my_list = [ one, two, three, four, five, six, ] result = some_arguments( '1', '2', '3', '4', '5', '6', )

👎 Ошибочное оформление

# Без вертикального выравнивания аргументы не должны располагаться на первой линии foo = name_of_function(one, two, three, four) # Используется больше отступов для выделения блока от остальных def name_of_function( one, two, three, four): print(one)

😐 Выборочное оформление

# Использование небольших отступов foo = name_of_function( one, two, three, four)

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

some_list = [ one, two, three, four, five, six, ] res = some_arguments( '1', '2', '3', '4', '5', '6', )

Табуляция или пробелы – что использовать? 🤷‍♂️

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

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

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

Настройка IDE для работы с отступами

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

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

PyCharm

В случае использования интегрированной среды разработки PyCharm для настройки оформления отступов необходимо последовательно перейти по таким пунктам меню:

File –> Settings –> Editor –> Code style –> Python

Для настроек параметров есть 3 поля:

  1. Tab size – количество пробелов при нажатии клавиши Tab;
  2. Indent – количество пробелов для одного отступа;
  3. Continuation indent – количество пробелов для отступа, когда следующая строка продолжает предыдущую.

💭 Еще одна полезная опция – отображение точек вместо каждого пробела, что особо удобно при поддержке чужого кода. В PyCharm для активации этой функции следует перейти File –> Settings –> Editor –> General –> Appearance –> Show whitespaces, установив галочку напротив соответствующего пункта.

VSCode

Для настройки аналогичных функций в VSCode нужно нажать комбинацию клавиш ctrl + , или перейти по пунктам меню

File –> Preferences –> Settings

Далее для ускорения в строке поиска ввести tab и установить нужные значения для таких опций:

  • editor: insert spaces – использовать ли пробелы вместо табуляции;
  • editor: tab size – желаемое количество пробелов для одного отступа.

Ошибки при работе с отступами

При неправильном оформлении отступов интерпретатор Python будет сообщать об ошибках. Таких ошибок может быть несколько, рассмотрим основные.

expected an indented block

Данная ошибка может возникать в случае, когда после оглашения начала блока кода – def, if, while и некоторых других на следующей строке отсутствует отступ. Для ее исправления после начала блока должна быть хотя бы одна вложенная строка с отступом.

unexpected indent

Возникает ошибка в том случае, когда перед началом строки есть отступ, но на предыдущей отсутствует оглашение начала блока кода, то есть, нет def, if, elif, else, for или while. Обычно такая ситуация возникает случайно, когда программист ставит слишком много пробелов в начале строки.

Indentationerror: expected an indented block

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


Таким образом, отступы в языке программирования Python, в отличие от многих других, играют такую же важную роль, как и служебные слова, так как именно они определяют создание блоков кода. Для каждого indent рекомендуется использовать 4 пробела, однако программист по своему желанию может установить и другое их количество, главное – одинаковое во всем проекте.

😭
😕
😃
😍