Найти в Дзене
Калинкин

Что означает "непоследовательное использование табуляций и пробелов в отступах" в Python и как это исправить

Оглавление
Непоследовательное использование табуляций и пробелов в отступах
Непоследовательное использование табуляций и пробелов в отступах

Узнайте, почему отступ в Python так важен и как вы можете исправить любые ошибки.

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

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

Отступ 101

Мы проиллюстрируем, как работает отступ в Python, на простом примере. Приведенный ниже блок кода содержит цикл for, который выводит некоторые числа на экран. По завершении будет выведена последняя строка с сообщением "готово", поскольку два print() оператора имеют отступы разного уровня. Для получения дополнительной информации об print()

>>> for index in range(3):
...     print(index)
... print('done')
Это результат:
0
1
2
done

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

Что с пробелами?

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

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

Табуляции против пробелов

Давайте продемонстрируем, почему смешивать табуляции и пробелы - плохая идея. Чтобы воспроизвести ошибку во введении, откройте базовый текстовый редактор, такой как Notepad, и напишите следующий цикл for:

>>> for index in range(3):
...     print(index)
...     print('done')

В print(index) строке должен быть сделан отступ табуляцией, а затем в print('done') строке должно быть указано эквивалентное количество пробелов; обе строки имеют одинаковый уровень отступа. Сохраните ваш файл как test.py. Из командной строки запустите:

>>> python test.py

Вывод, выводимый в командную строку, будет содержать информацию о том, где произошла ошибка, а также сообщение:

TabError: inconsistent use of tabs and spaces in indentation

Поскольку табуляции и пробелы плохо сочетаются друг с другом, теперь возникает вопрос, что лучше использовать для отступов в коде. На первый взгляд, табуляция кажется предпочтительнее, поскольку она экономит некоторые нажатия клавиш. Но в разных IDE и редакторах кода длина табуляции может отличаться, обычно это 4 или 8 пробелов. Это может быть проблемой, если программа разрабатывается в разных редакторах; после отступа табуляцией в одном редакторе одна и та же вкладка может иметь разную длину в других редакторах. Пробел, с другой стороны, занимает только один символ и позволяет избежать этой потенциальной проблемы.

Это предпочтение пробелов перед табуляциями отражено в рекомендации, представленной в РУКОВОДСТВЕ ПО СТИЛЮ PEP 8 ДЛЯ КОДА PYTHON. В целом, стоит прочитать, поскольку раннее освоение хорошего стиля будет полезно в будущем. Но раздел о ТАБУЛЯЦИЯХ ИЛИ ПРОБЕЛАХ? указано явно:

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

Кроме того, в разделе о ОТСТУПАХ указано, что следует использовать 4 пробела на уровень отступа. Итак, вот оно. Предпочтительный способ правильного отступа кода в Python - использовать 4 пробела на уровень.

Как отладить “непоследовательное использование табуляций и пробелов в отступах”

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

Большинство текстовых редакторов или IDE имеют функцию ‘найти и заменить’; в Windows вы обычно можете открыть ее, нажав CTRL + f или воспользовавшись панелью инструментов. Если вы нажмете клавишу tab, находясь в поле поиска, вы просто переместите фокус окна, поэтому вам нужно скопировать символ табуляции (‘\t’ или ‘ ‘) в поле поиска, а затем ввести 4 пробела (‘ ’) в поле замены. Проблема решена.

Если вы работаете на компьютере с Linux, где у вас не установлен текстовый редактор (например, если вы работаете на удаленном сервере), и вам нужно отредактировать свою программу из командной строки, вы можете попробовать команду SED. Это потоковый редактор, который позволяет вам преобразовывать текст несколькими способами. Чтобы заменить табуляции пробелами, попробуйте что-то вроде этого:

sed -i.bak $'s/\t/    /g' filename

Если вы работаете на компьютере с Windows, ознакомьтесь с SED ДЛЯ WINDOWS

Заключительные слова

Чтобы избежать этой проблемы и оставаться в соответствии с руководством по стилю PEP 8, также неплохо настроить вашу IDE так, чтобы при нажатии клавиши tab всегда вставлялось 4 пробела. Настройка этого зависит от того, какую IDE вы используете. Для тех из вас, кто не знаком с тем, какие IDE доступны, ознакомьтесь с моей статьей Лучшие Python IDE и редакторы кода.

Для пользователей VSCode, если вы посмотрите в правом нижнем углу вашего окна, вы должны увидеть что-то вроде пробелов: 4. Нажав здесь, вы получите возможность настроить метод отступа. Если выбранная вами среда РАЗРАБОТКИ PyCharm, обратитесь к документации по ТАБУЛЯЦИЯМ И ОТСТУПАМ, чтобы получить всю необходимую информацию о настройке этой опции. Пользователям Spyder IDE следует перейти к Инструментам – Настройкам – Редактору – Исходному коду – Символам отступа. Если вы используете более старую версию, это Инструменты – Настройки – Редактор – Дополнительные настройки – Символы отступа.