Гид по технологиям

Как исправить "IndentationError: expected an indented block" в Python

6 min read Python Обновлено 15 Dec 2025
Исправление IndentationError в Python
Исправление IndentationError в Python

Женщина держит книгу с заголовком «Python»

Почему в Python появляется IndentationError

Python использует отступы для определения блоков кода. В других языках блоки часто ограничивают фигурными скобками; в Python уровень отступа — это синтаксис. Если после строки, которая требует блока (например, if, for, while, def, class), сразу не следует правильно отформатированный блок, интерпретатор выдаст “IndentationError: expected an indented block”.

Ключевые причины ошибки:

  • Отсутствует код внутри блока после двоеточия (:).
  • Строка имеет неправильный уровень отступа (меньше или больше, чем ожидается).
  • Смешивание табов и пробелов, что приводит к неоднозначности при расчёте выравнивания.
  • Нечаянный пропуск второго уровня отступа при вложенных конструкциях.

Важно: разные ошибки отступа приводят к разным сообщениям (например, “unexpected indent” — когда отступ есть, но он лишний в текущем контексте).

Простой пример ошибки и исправления

Ниже — типичный пример с ошибками отступа. Исходный (неправильный) вариант:

fname = "Gaurav"
lname = "Siyal"

if fname == "Gaurav" and lname == "Siyal":
print("You're Gaurav")
else:
print("You're somebody else")

Запуск этого кода выдаст:

  File "tmp.py", line 5
    print("You're Gaurav")
    ^
IndentationError: expected an indented block after 'if' statement on line 4

Исправленный вариант (4 пробела, соответствующие рекомендациям PEP 8):

fname = "Gaurav"
lname = "Siyal"

if fname == "Gaurav" and lname == "Siyal":
    print("You're Gaurav")
else:
    print("You're somebody else")

Альтернатива с табами (последовательно использовать только табы, но PEP 8 рекомендует пробелы):

fname = "Gaurav"
lname = "Siyal"

if fname == "Gaurav" and lname == "Siyal":
    print("You're Gaurav")
else:
    print("You're somebody else")

Важно: никогда не смешивайте табы и пробелы в одном проекте — это частая причина неожиданных IndentationError.

Ошибка “unexpected indent” и как её исправить

“IndentationError: unexpected indent” означает, что интерпретатор встретил отступ там, где его не ожидал — обычно это строка вне какого-либо блока, но начинающаяся с пробела или таба.

Пример с ошибкой:

num = 5
    num += 2

Исправление — убрать лишний отступ:

num = 5
num += 2

Общие случаи неправильных отступов

If-операторы

Если тело if не имеет отступа, вы получите сообщение “expected an indented block after ‘if’ statement”. Всегда добавляйте отступы на все строки тела.

Правильно:

if my_name == "Gaurav":
    print("My name is Gaurav")

Функции

После определения функции тело должно быть с отступом. В Python 3 используйте скобки у print.

Правильно:

def magic_number():
    result = 42
    return result

print(magic_number())

Циклы for/while

Те же правила — после двоеточия идёт блок с отступом.

for i in range(10):
    print(i)

Докстроки

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

def do_something():
    """Эта функция что-то делает"""
    return True

Настройки редактора для предотвращения ошибок отступов

Большинство современных IDE и текстовых редакторов умеют автоматически управлять отступами. Настройте редактор, чтобы он использовал выбранный стиль (рекомендуется 4 пробела).

Пример (Spyder): Инструменты > Настройки > Исходный код — параметры отступов и конвертации табов.

Интерфейс Spyder — настройки отступов

Для Vim можно добавить в ~/.vimrc:

set autoindent
set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4

Эта конфигурация заставит Vim подставлять 4 пробела при нажатии клавиши Tab.

Советы по редакторам:

  • Включите отображение пробелов и табов (show whitespace). Это быстро выявляет смешивание символов.
  • Включите конвертацию табов в пробелы (если вы используете пробелы).
  • Включите линтер (flake8, pylint) — они отмечают нарушения PEP 8 и потенциальные проблемы с отступами.

Поведенческие и командные практики (SOP для команды)

  1. Выберите стиль отступов для проекта (рекомендуется 4 пробела).
  2. Добавьте файл конфигурации редактора в репозиторий (.editorconfig или настройки IDE), чтобы все разработчики имели одинаковые настройки.
  3. Настройте pre-commit хук, который проверяет смешивание табов и пробелов и запускает линтер.
  4. В code review проверяйте ровные отступы, особенно в новом коде или при рефакторинге.

Мини-методология отладки (быстро):

  • Шаг 1: Прочитайте сообщение об ошибке — запомните номер строки.
  • Шаг 2: Откройте указанный файл и перейдите к строке.
  • Шаг 3: Проверьте наличие двоеточия (:) в заголовке блока перед этой строкой.
  • Шаг 4: Убедитесь, что следующие строки имеют единообразный отступ.
  • Шаг 5: Включите в редакторе отображение невидимых символов и linters.

Чек-листы по ролям

Разработчик — при написании кода:

  • Использую 4 пробела для отступа.
  • Не смешиваю табы и пробелы.
  • Запускаю линтер до коммита.
  • Проверяю встроенные тесты.

Код-ревьюер — при проверке PR:

  • Отступы одинаковы в изменённых файлах.
  • Нет «пустых» блоков без тела (или есть pass).
  • Докстроки корректно отступлены.

Инженер CI:

  • Настроен pre-commit с flake8/black.
  • CI падает на смешивание табов/пробелов.

Подсказки и эвристики (mental models)

  • Правило двух шагов: после двоеточия — один уровень отступа. Вложенные блоки — каждый следующий уровень +1.
  • Если не уверены — используйте 4 пробела. Это «по умолчанию» по PEP 8.
  • Псевдопроверка: если ошибка появляется после исправления — включите отображение невидимых символов; скорее всего где-то остался таб.

Факт-бокс: ключевые идеи

  • Python использует отступы как синтаксис блоков.
  • PEP 8 рекомендует 4 пробела для уровня отступа.
  • Смешивание табов и пробелов — частая причина IndentationError.
  • Линтеры и конфигурация редакторов снижают вероятность ошибок.

Edge cases — на что ещё обратить внимание

  • Многострочные выражения с открытой скобкой: интерпретатор допускает выравнивание по открывающей скобке, но будьте последовательны.
result = some_function(
    param_one,
    param_two
)
  • Декораторы: убедитесь, что последующая функция правильно отступлена.
@decorator
def func():
    pass
  • Пустые блоки: если намеренно не пишете тело — используйте pass.
if condition:
    pass

Примеры тест-кейсов (для приёмки)

Критерии приёмки:

  • Все файлы проекта проходят flake8/black без ошибок, связанных с отступами.
  • Никаких смешанных табов и пробелов в репозитории.
  • Минимум один тест проверяет поведение кода, изменённого в PR.

Быстрое руководство — Cheat sheet

  • Используйте 4 пробела.
  • Включите show whitespace.
  • Добавьте .editorconfig или настройте IDE.
  • Настройте pre-commit hook с flake8.
  • В code review проверяйте отступы и пустые блоки.

Частые ошибки и когда предложенные подходы не работают

  • Если вы работаете с чужим кодом, где уже используются табы повсеместно, лучше привести проект к единообразию постепенно (автоформатирование в отдельном PR), иначе автоформат может создать множество конфликтов.
  • В бинарных или просто скриптовых файлах в проектах с историей может быть смесь стилей — используйте CI, чтобы постепенно подчистить это.

Функция Python для вычисления факториала целого числа

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

Краткое резюме

Отступы в Python — это не только стиль, это синтаксис. Большинство IndentationError решаются проверкой строки, указанной в сообщении об ошибке, и выравниванием тела блока с постоянным набором символов (рекомендуется 4 пробела). Настройте редактор, используйте linters и pre-commit хуки, чтобы исключить проблему на ранних этапах.

FAQ

Что лучше — табы или пробелы?

PEP 8 рекомендует 4 пробела. Главное — единообразие в проекте: если проект использует табы, придерживайтесь их.

Почему линтер не нашёл ошибку отступа?

Некоторые ошибки появляются только во время выполнения, если есть динамическое формирование кода или файлы не проверяются линтером. Убедитесь, что все релевантные файлы проходят линтеры в CI.


Важно: если вы исправили видимые отступы и ошибка остаётся, проверьте невидимые символы и кодировку файла (иногда в файле присутствуют непечатаемые символы).

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Добавить Take Ownership в контекстное меню
Windows

Добавить Take Ownership в контекстное меню

Голосовой ввод в Windows 11 — включение и советы
Windows

Голосовой ввод в Windows 11 — включение и советы

Уведомления Google Форм на email — настройка
Google Forms

Уведомления Google Форм на email — настройка

Petey на Apple Watch — ChatGPT на запястье
Приложения

Petey на Apple Watch — ChatGPT на запястье

Искать по содержимому в Windows: добавить типы файлов
Windows

Искать по содержимому в Windows: добавить типы файлов

MicroK8s: быстрый старт и эксплуатация
Kubernetes

MicroK8s: быстрый старт и эксплуатация