Ошибка отступа IndentationError: причины, примеры и исправление

Ошибки Pythonобновлено 07.10.20268 мин чтенияесть тренажёр

IndentationError в Python — это ошибка отступа: строка сдвинута не так, как ожидает интерпретатор. Чаще всего забыт отступ после двоеточия, стоит лишний пробел или перемешаны табы и пробелы. Исправление почти всегда одно — выровнять блок на 4 пробела.

Загружаем…

Что означает 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 шага: посмотрите номер строки в сообщении, проверьте строку над ней, сравните отступы в блоке и проверьте двоеточие.

  1. Номер строки. Python указывает строку, на которой понял, что что-то не так. Ошибка либо в ней, либо в строке над ней.
  2. Строка выше. Если над ошибкой стоит if, for или def, проверьте, что после неё есть хотя бы одна сдвинутая строка.
  3. Ровность блока. Поставьте курсор в начало каждой строки блока: все должны начинаться в одной колонке.
  4. Двоеточие. Без двоеточия после 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 ту же границу показывает сдвиг строк вправо.