#Что означает ошибка
IndentationError
IndentationError: unexpected indent, expected an indented block и TabError: inconsistent use of tabs and spaces — ошибки отступов Python. Блоки кода в Python определяются отступами, поэтому смешивать табы и пробелы или сдвигать строки произвольно нельзя.
Сообщение указывает номер строки, но настоящая ошибка часто в строке выше: цикл или условие без тела, лишний пробел в продолжении.
Лучше всего настроить редактор так, чтобы проблема не возникала.
Используйте единый стиль отступов и настройте редактор.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Табы и пробелыСмесь. | Один отступ глубже, чем требует if/def/for | Откройте строку из traceback и сопоставьте с окружающим блоком. |
| Лишний отступКод. | Смешаны табуляция и пробелы в одном блоке | Включите отображение пробелов и единый стиль редактора. |
| КопированиеФорматирование. | Перед блоком отсутствует двоеточие | Исправьте синтаксис строки-условия, а не только отступы. |
| РедакторНастройка. | Автоматическое форматирование нарушило вложенность | Сверьте git diff и восстановите правильную логику блока. |
#Пошаговое решение
- Откройте указанную строку и строку вышеСкопируйте полный traceback и откройте в редакторе
.pyфайл, указанный послеFile "...", line N. Перейдите к строке N через Ctrl+G (VS Code) и посмотрите также предыдущие строки: отступ может быть лишним или пропущено двоеточие послеif,for,def,tryи т. п. Не исправляйте ошибку механическим удалением пробелов, пока не выяснили ожидаемую вложенность блока. - Включите показ пробельных символовВ VS Code откройте меню «Вид» → «Внешний вид» → «Отображать пробелы» (в разных версиях можно воспользоваться настройкой
Editor: Render Whitespaceи выбратьall). Внизу редактора нажмите обозначениеSpaces: 4илиTab Size; по видимым символам определите строки, содержащие табуляцию. В Python уровень отступа должен соответствовать логике блока. При ошибкеTabErrorчаще всего в одной группе смешаны табы и пробелы. - Преобразуйте отступы в пробелыЕсли проект использует четыре пробела, выделите нужный файл в VS Code, откройте палитру команд Ctrl+Shift+P →
Convert Indentation to Spaces. Установите размер отступа 4 только при согласовании со стилем проекта; затем проверьте вложенность функций, циклов, условий и многострочных выражений. Эта команда может затронуть весь файл, поэтому перед ней сохраните исходную версию или проверьтеgit diff. Для редактора с другими настройками используйте эквивалентную команду, не заменяйте табы во всех файлах вслепую. - Запустите проверкуОткройте встроенный терминал в папке скрипта и запустите
python -m tabnanny путь/к/файлу.py— подставьте реальный путь, содержащий пробелы заключите в кавычки. Если tabnanny выводит предупреждение о неоднозначном отступе, исправьте указанную строку. Затем выполнитеpython -m py_compile путь/к/файлу.py: это проверка синтаксиса и создание кэша__pycache__, не запуск бизнес-логики программы. Отсутствие вывода при коде возврата 0 означает, что компиляция успешна. - Настройте
.editorconfigДля команды добавьте в корень проекта файл.editorconfigс настройкамиroot = true,[*.py],indent_style = space,indent_size = 4(каждую запись на отдельной строке) и включите поддержку EditorConfig в редакторе. Не меняйте настройку проекта без согласования, если исходный код придерживается другой схемы. Запустите обычные тесты: компиляция гарантирует корректность синтаксиса, но не логики отступов.
#Как найти проблему
Откройте файл и включите отображение пробельных символов: VS Code — «Вид → Отображать пробельные символы» или Ctrl+Shift+P → Toggle Render Whitespace; PyCharm — «Settings → Editor → General → Appearance → Show whitespaces». Табы показываются стрелками, пробелы — точками. Автоматически найти табы можно командой grep -nP "\t" файл.py или python -m tabnanny файл.py.
#Как исправить массово
В VS Code после резервной копии выделите нужный файл и воспользуйтесь палитрой команд Convert Indentation to Spaces, затем проверьте все уровни вложенности. Команды массовой замены sed и expand не понимают синтаксис Python и могут изменить семантику блоков; форматтер Black также не обязан восстанавливать сломанные отступы. После правки выполните python -m tabnanny файл.py и python -m py_compile файл.py.
#Типичные случаи
if x: без тела — добавьте pass. Отступ в 3 пробела вместо 4 в середине блока. Строки, скопированные из чата или сайта, где табы заменены неразрывными пробелами (U+00A0) — удалите их и введите отступ заново. Многострочные выражения в скобках отступа не требуют, а обратный слеш \ в конце строки не должен сопровождаться пробелом.
#Предотвращение
В VS Code задайте "editor.insertSpaces": true и "editor.tabSize": 4, создайте в проекте .editorconfig с indent_style = space и indent_size = 4. Включите линтер: pip install flake8, затем flake8 файл.py — он сообщит об E101 и W191 ещё до запуска.
# Подставьте имя существующего файла .py вместо example.pypython -m tabnanny example.pypython -m py_compile example.py