#Что означает ошибка
IndentationError: unexpected indent
В Python отступы — часть синтаксиса: они определяют блоки кода. IndentationError: unexpected indent говорит, что строка имеет отступ там, где он не ожидается; близкие ошибки — expected an indented block (после if/def нет тела) и unindent does not match any outer indentation level (отступ не совпадает ни с одним уровнем). Они почти всегда возникают из-за смеси табуляции и пробелов или копирования кода.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Смесь табов и пробеловВ файле и табы, и пробелы. | Строки выглядят выровненными, но ошибка есть. | Приведите к пробелам. |
| Лишний отступСтрока сдвинута без причины. | Ошибка указывает на строку. | Уберите отступ. |
| Копирование кода из мессенджера или сайтаВставка принесла невидимые символы. | Код скопирован из чата. | Очистите отступы. |
Отсутствует тело блокаПосле : нет кода. | expected an indented block. | Добавьте pass. |
#Пошаговое решение
- Откройте строку из сообщенияВ сообщении
IndentationError: unexpected indentнайдите строкуFile "...", line Nи откройте указанный Python-файл в VS Code через «Файл → Открыть файл». Нажмите Ctrl+G, введите N, перейдите к проблемной строке и сравните её со строками выше и ниже. Часто лишний отступ находится после уже закрытого блока или при копировании кода. Сначала сохраните копию или создайте отдельную ветку Git, затем исправляйте отступы именно этого участка; не удаляйте все пробелы во всём файле. - Включите отображение пробеловВ VS Code откройте настройки Ctrl+, и найдите
Render Whitespace; установите «all» на время проверки. В начале строк появятся видимые точки и стрелки табуляции. Сравните с ближайшими строками той же логической вложенности. В Python единицы отступа должны быть согласованными; если строка неожиданно сдвинута на один уровень, верните её к отступу соседних операторов того же блока. После сохранения снова запустите файл и посмотрите, не указывает ли новый номер на другую ошибку. - Преобразуйте табы в пробелыЕсли редактор показывает смесь табуляций и пробелов, нажмите индикатор «Spaces»/«Tab Size» в правой нижней части VS Code и выберите «Преобразовать отступы в пробелы» (название зависит от локализации). Для обычного кода Python выберите 4 пробела на уровень. Прежде чем преобразовывать весь файл, проверьте его стиль и согласуйте изменения в командном проекте: это может создать большой ненужный diff. На копии сравните структуру блоков
if,for,defиtryдо и после правки. - Проверьте блокПроверьте двоеточия и границы блока: после
if условие:,def имя(...):,classи т. п. первая строка тела должна иметь больший отступ;else,elif,exceptиfinallyобычно возвращаются к уровню соответствующего оператора. Если тело намеренно пусто, разрешён операторpassс правильным отступом, но не вставляйте его автоматически в существующую рабочую логику. Для неожиданного отступа передreturnилиprintсравните уровни с соседними инструкциями в функции. - Запустите проверкуСохраните файл и в терминале проекта выполните
python -m py_compile script.py, заменив имя файла на реальное. Python создаст служебные файлы в__pycache__; если синтаксис принят, команда обычно молчит. Затем выполнитеpython -m tabnanny script.pyдля выявления неоднозначного смешения отступов. При новом сообщении вернитесь к указанной строке; успешная компиляция проверяет лишь синтаксис, а не правильность поведения программы — запустите и основные тесты проекта. - Исправьте вставкуЕсли ошибочная строка скопирована из веб-страницы, удалите только её ведущие пробелы и введите их заново клавишей пробела. Внешне похожие неразрывные пробелы и смешанные табуляции могут быть плохо заметны; проверьте режим отображения пробелов. Не запускайте автоматическую замену всех пробелов в проекте. Если после копирования блок целиком оказался на неправильном уровне, сравните с исходником и восстановите структуру условных и циклических блоков.
- Используйте форматтерСредство Black может привести корректный файл к единому оформлению, но не восстанавливает произвольно сломанную структуру Python. Поэтому сначала исправьте
IndentationError, выполнитеpy_compileи тесты, лишь затем при необходимости форматируйте копию или отдельную ветку проекта. Проверьте разницу черезgit diff, прежде чем сохранять изменения. Если форматтер удаляет или изменяет множество строк вне проблемного участка, отмените его результат и уточните принятую политику форматирования команды. - Настройте редакторЧтобы предотвратить ошибки в новых файлах, настройте в редакторе Python-отступ 4 пробела и при наличии проектного
.editorconfigпрочитайте его параметрыindent_styleиindent_size. Не перезаписывайте общий файл конфигурации редактора, не согласовав изменения с командой. Откройте новый тестовый файл и проверьте, что клавиша Tab вставляет соответствующее количество пробелов. При повторении ошибки сообщите номер строки и минимальный фрагмент кода, убрав пароли, ключи и личные данные. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
Строка вида grep -nP "\t" script.py покажет все строки с символом табуляции. Если ошибка появилась после копирования кода из веб-страницы, возможна подмена пробелов на неразрывные (символ \xa0): найдите их командой grep -nP "\xA0" script.py и замените. В Jupyter Notebook ошибка часто возникает при вставке нескольких ячеек подряд. Начиная с Python 3, смешивание табов и пробелов в одном блоке запрещено, поэтому выбирайте один стиль для проекта — стандарт PEP 8 рекомендует 4 пробела. Документация — .