Что означает IndentationError в Python
IndentationError в Python — это сообщение интерпретатора о том, что отступы в программе нарушают правила языка. В Python отступ не украшение: он показывает, какие строки входят в тело условия, цикла или функции.
Во многих языках блок кода выделяют фигурными скобками, а Python использует отступы. Строка с двоеточием на конце — if, for, while, def, else — открывает блок, и все строки блока должны быть сдвинуты одинаково. Руководство по стилю PEP 8 рекомендует сдвиг на 4 пробела[1]. Попробуйте запустить код в редакторе выше: в нём специально допущена ошибка, а под выводом появится подсказка.
if 5 > 3:
print("Пять больше трёх")
File "main.py", line 2
print("Пять больше трёх")
^
IndentationError: expected an indented block after 'if' statement on line 1
Python дошёл до второй строки, ожидал увидеть сдвинутое тело условия и не нашёл его. Номер строки в сообщении указывает, где интерпретатор споткнулся, а текст после двоеточия — что именно не так. Точная формулировка зависит от версии, но слова «IndentationError» и «indented block» будут всегда. Встроенные исключения и их сообщения описаны в официальной документации Python[2].
Почему IndentationError в Python так часто встречается у новичков
IndentationError в Python встречается у новичков чаще других ошибок по 3 причинам: в блочных средах отступов не было, в тетради их не видно, а при копировании кода они легко ломаются.
Ребёнок, который пришёл из Scratch, привык, что блок сам «защёлкивается» внутрь цикла. В тексте эту работу приходится делать руками, и первые недели рука забывает про пробелы. Помогает простое упражнение: перед запуском провести пальцем по левому краю кода и вслух сказать, какие строки внутри цикла, а какие после него. Через несколько дней это становится привычкой. В школьной информатике отступы тоже важны: по федеральной программе основного общего образования ветвления и циклы изучают в 8 классе, и при записи на Python без верных отступов программа не запустится ни на уроке, ни на экзамене.
Хорошая новость в том, что эта ошибка самая безопасная: она не портит данные и не мешает программе работать неправильно — Python просто отказывается запускаться, пока отступы не станут ровными.
Три вида сообщений об отступах
Ошибки отступа бывают 3 видов, и у каждого своё сообщение: нет отступа там, где он нужен, есть отступ там, где он не нужен, и отступ не совпадает ни с одним уровнем выше.
| Сообщение | Что случилось | Как исправить |
| expected an indented block | После строки с двоеточием тело не сдвинуто | Сдвиньте строки тела на 4 пробела |
| unexpected indent | Строка сдвинута без причины — над ней нет двоеточия | Уберите лишние пробелы в начале строки |
| unindent does not match any outer indentation level | Строка вернулась на уровень, которого не было: например, 3 пробела вместо 4 | Выровняйте по уровню блока выше |
| TabError: inconsistent use of tabs and spaces | В одном блоке перемешаны табуляция и пробелы | Замените все табы на пробелы |
TabError — родственник IndentationError: это отдельный тип ошибки, но причина та же — неоднородные отступы. Редактор на нашем сайте при нажатии Tab вставляет 4 пробела, поэтому смешать их трудно. В IDLE и большинстве редакторов кода есть такая же настройка.
Пример: unexpected indent
Unexpected indent — это лишний отступ в строке, которая ничему не подчиняется. Чаще всего он появляется, когда код копируют с сайта или из сообщения вместе с пробелами.
name = "Аня"
print("Привет,", name)
Вторая строка сдвинута, но над ней нет ни условия, ни цикла, ни функции. Python не понимает, частью какого блока она должна быть. Исправление — удалить пробелы в начале строки:
name = "Аня"
print("Привет,", name)
Если строк с лишним отступом много, выделите их и нажмите Shift+Tab — в большинстве редакторов это сдвигает блок влево. В IDLE для этого есть пункт меню Format → Dedent Region.
Пример: unindent does not match
Unindent does not match — это возврат на уровень отступа, которого не было выше. Обычно виновата одна строка с 3 или 5 пробелами среди строк с 4.
for i in range(3):
print("Шаг", i)
print("Готово")
Третья строка сдвинута на 3 пробела: это меньше, чем 4 у тела цикла, и больше, чем 0 у самого for. Python не может решить, куда её отнести. Если «Готово» должно выводиться один раз после цикла, уберите отступ полностью; если на каждом шаге — сделайте ровно 4 пробела.
for i in range(3):
print("Шаг", i)
print("Готово")
Этот пример показывает главное: отступ меняет смысл программы. Перенос print("Готово") на уровень тела цикла не вызовет ошибки, но слово «Готово» появится трижды. Поэтому, исправляя IndentationError, думайте не «как убрать ошибку», а «какой строке где место».
Как исправить IndentationError в Python за минуту
Чтобы исправить IndentationError в Python, пройдите 4 шага: посмотрите номер строки в сообщении, проверьте строку над ней, сравните отступы в блоке и проверьте двоеточие.
- Номер строки. Python указывает строку, на которой понял, что что-то не так. Ошибка либо в ней, либо в строке над ней.
- Строка выше. Если над ошибкой стоит
if,forилиdef, проверьте, что после неё есть хотя бы одна сдвинутая строка. - Ровность блока. Поставьте курсор в начало каждой строки блока: все должны начинаться в одной колонке.
- Двоеточие. Без двоеточия после
ifбудет SyntaxError, а не ошибка отступа, но их часто путают.
Если блок пока пустой — например, вы написали def и ещё не придумали тело, — поставьте внутрь команду pass. Она ничего не делает, но закрывает требование «в блоке должна быть хотя бы одна строка».
«Отступы в Python — дело вкуса, можно ставить сколько угодно». Это миф: внутри одного блока отступы обязаны совпадать, а PEP 8 рекомендует ровно 4 пробела.
«Если ошибка в строке 7, то и искать надо только в строке 7». Это не подтверждается практикой: часто виновата строка выше — например, условие без тела.
Когда совет «добавь 4 пробела» не работает
Совет «добавь 4 пробела» не работает, когда причина ошибки не в самом пробеле. В этих 4 случаях нужно искать дальше.
- После исправления появилась ошибка на 1 строку ниже. Значит, сдвинуть нужно весь блок, а не одну строку.
- Строки выглядят ровными, но ошибка остаётся у 2 соседних. Скорее всего, одна сдвинута табом, другая пробелами.
- Код скопирован из 1 источника с неразрывными пробелами. Перепечатайте пробелы вручную — копировать такой код нельзя.
- В 1-й строке сообщения написано SyntaxError, а не IndentationError. Это другая ошибка: проверьте двоеточие, скобки и кавычки на странице о SyntaxError в Python.
Чего делать нельзя
Нельзя двигать строки наугад, пока ошибка не исчезнет: так легко получить работающую, но неправильную программу. Вот шесть правил.
- Нельзя смешивать табы и пробелы в одном файле — это прямой путь к TabError.
- Не следует ставить 2 или 3 пробела «для компактности»: PEP 8 рекомендует 4, и так читается любой код.
- Не стоит выравнивать всё по левому краю, чтобы ошибка пропала: программа перестанет делать то, что задумано.
- Не допускается оставлять блок пустым — после двоеточия нужна хотя бы одна строка или
pass. - Нельзя игнорировать номер строки в сообщении: он экономит больше всего времени.
- Не стоит копировать код вместе с номерами строк и лишними пробелами с сайтов — перепечатывайте или выравнивайте.
Общий порядок чтения любых сообщений интерпретатора разобран в статье о том, как читать ошибки Python, а правила оформления кода — в материале про стиль кода и PEP 8. Тела циклов подробно показаны в уроке про цикл for.
Источники
[1] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.
[2] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
[3] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
Вопросы и ответы
Сколько пробелов ставить в начале строки блока?
Четыре — так рекомендует PEP 8, и так пишут почти все программисты на Python. Технически подойдёт любое количество, если оно одинаково во всём блоке, но 4 — общепринятый стандарт.
Почему Python так строг к отступам?
Сдвиг строк заменяет в Python фигурные скобки других языков: по нему интерпретатор понимает, где начинается и заканчивается блок. Зато код на Python всегда выглядит аккуратно — по-другому он просто не запустится.
Что такое TabError?
Это ошибка смешанного сдвига: в одном блоке часть строк сдвинута табуляцией, часть пробелами. Включите в редакторе замену табов на пробелы и перепечатайте начало строк. Без этого запустить программу не получится.
Можно ли писать тело условия в той же строке?
Короткую команду можно: if x > 0: print(x). Но для читаемости так делать не стоит: переносите тело на новую строку, особенно на старте.
Почему ошибка указывает на строку, где всё правильно?
Python замечает проблему там, где ожидание не совпало с реальностью. Если в строке выше условие без тела, ошибка будет показана у следующей строки, хотя исправлять нужно выше.
Есть ли отступы в Scratch?
В Scratch их роль играют «челюсти» блоков «повторить» и «если»: что внутри челюсти, то и в теле. В Python ту же границу показывает сдвиг строк вправо.