Предупреждение W293 blank line contains whitespace выдают линтеры pycodestyle и flake8, когда на визуально пустой строке Python-файла остались пробелы или символы табуляции. Такая строка выглядит пустой в редакторе, но на самом деле содержит невидимые символы, что нарушает стандарт оформления кода PEP 8.
Ошибка не останавливает выполнение программы — интерпретатор Python игнорирует пробельные символы на пустых строках. Однако линтеры помечают её, потому что невидимый «мусор» засоряет diff при код-ревью, ломает автоматические проверки в CI и затрудняет сопровождение проекта. Ниже разберём, откуда берутся эти пробелы и как убрать их раз и навсегда.
Что означает предупреждение W293
Код W293 относится к семейству предупреждений о пробельных символах (whitespace) в стандарте PEP 8. Линтер сканирует каждую строку файла: если строка не содержит ничего, кроме пробелов или табуляций, она должна быть полностью пустой. Любой «хвост» из невидимых символов считается нарушением.
Типичный вывод линтера выглядит так:
main.py:12:1: W293 blank line contains whitespace
Здесь 12 — номер строки, 1 — позиция символа. Откройте файл, перейдите на указанную строку и включите отображение невидимых символов в редакторе: вы увидите точки или стрелки там, где визуально ничего нет.
Важно не путать W293 с похожими предупреждениями:
- 🔍 W291 — trailing whitespace: пробелы в конце строки, где есть код;
- 🔍 W292 — no newline at end of file: отсутствует перевод строки в конце файла;
- 🔍 W293 — пробелы на строке, которая должна быть пустой;
- 🔍 E303 — слишком много пустых строк подряд.
Почему на пустых строках появляются пробелы
Наиболее частая причина — автоотступ редактора. Когда вы нажимаете Enter внутри функции, IDE автоматически добавляет отступ на новой строке. Если затем вы уходите с этой строки, не написав код, отступ остаётся — строка становится «пустой с пробелами».
Вторая типичная ситуация — копирование фрагментов кода из браузера, мессенджеров или PDF-документов. Вместе с текстом переносятся неразрывные пробелы и лишние отступы, которые попадают на пустые строки между блоками.
Третий источник — совместная работа в команде, где у разных участников разные настройки редактора: кто-то использует табуляцию, кто-то пробелы, а функция автоматической очистки trailing whitespace включена не у всех.
Как быстро найти и исправить W293
Самый простой способ — запустить линтер и пройтись по списку найденных строк. В терминале выполните:
flake8 --select=W293 your_project/
или
pycodestyle --select=W293 your_project/
Для ручного исправления достаточно удалить все символы на указанных строках, оставив их полностью пустыми. В большинстве редакторов есть команда Trim Trailing Whitespace, которая очищает пробелы сразу во всём файле — в том числе на пустых строках.
☑️ Устранение W293 за 5 минут
Если файлов много, ручная правка утомительна. Здесь помогут автоформаттеры, о которых речь пойдёт ниже.
Автоматическое исправление: autopep8, black и ruff
Утилита autopep8 исправляет W293 автоматически, приводя файл в соответствие с PEP 8:
autopep8 --in-place --select=W293 your_file.py
Форматтер black не сообщает о W293 явно, но при форматировании удаляет пробелы с пустых строк как часть нормализации файла. Аналогично работает ruff с параметром --fix — он поддерживает правило W293 и исправляет его одной командой:
ruff check --select W293 --fix your_project/
Какой инструмент выбрать — зависит от вашего рабочего процесса:
| Инструмент | Тип | Исправляет W293 | Команда |
|---|---|---|---|
| flake8 | Линтер | Только показывает | flake8 --select=W293 |
| pycodestyle | Линтер | Только показывает | pycodestyle --select=W293 |
| autopep8 | Форматтер | Да | autopep8 --in-place |
| black | Форматтер | Да, при форматировании | black file.py |
| ruff | Линтер + фиксер | Да, с --fix | ruff check --fix |
⚠️ Внимание: перед массовым запуском автоформаттера убедитесь, что все изменения закоммичены в Git. Форматтер может перестроить весь файл, и откатить правки без системы контроля версий будет затруднительно.
Настройка редактора для профилактики
Чтобы предупреждение не возвращалось, настройте редактор один раз. В VS Code добавьте в settings.json параметр "files.trimTrailingWhitespace": true — пробелы будут удаляться при каждом сохранении файла. Там же можно включить "editor.renderWhitespace": "boundary", чтобы видеть невидимые символы.
В PyCharm соответствующая опция находится в настройках редактора: откройте Settings → Editor → General и в разделе сохранения файлов включите удаление trailing spaces. Точные названия пунктов и их расположение могут отличаться между версиями IDE, поэтому при расхождениях сверяйтесь с документацией вашей версии.
- ⚙️ Включите автоочистку trailing whitespace при сохранении;
- ⚙️ Включите отображение пробелов и табуляций;
- ⚙️ Настройте единый стиль отступов через
.editorconfig; - ⚙️ Подключите линтер к редактору для подсветки проблем в реальном времени.
Добавьте в корень проекта файл .editorconfig с параметром trim_trailing_whitespace = true — тогда настройка будет работать у всей команды независимо от того, какой редактор использует каждый разработчик.
Интеграция проверки в CI и pre-commit
Разовая чистка решает проблему сегодня, но не защищает от повторения. Надёжный способ — автоматическая проверка перед коммитом через pre-commit. Пример конфигурации .pre-commit-config.yaml:
repos:
- repo: https://github.com/pycqa/flake8
rev: "укажите актуальную версию"
hooks:
- id: flake8
args: ["--select=W291,W292,W293"]
В CI-конвейере (GitHub Actions, GitLab CI и подобных) добавьте шаг с запуском линтера — тогда код с W293 не пройдёт проверку и не попадёт в основную ветку. Конкретный синтаксис зависит от вашей CI-системы.
⚠️ Внимание: не отключайте правило W293 глобально через
--ignoreбез необходимости. Это дешёвое в исправлении предупреждение, а его игнорирование постепенно приводит к «зашумлённым» diff-ам в пул-реквестах.
W293 — косметическое, но показательное предупреждение: оно не ломает программу, однако сигнализирует о небрежности в оформлении. Автоочистка пробелов при сохранении и проверка в pre-commit полностью снимают проблему.
Когда W293 можно игнорировать
Иногда подавить предупреждение оправданно — например, в унаследованном коде, который вы не собираетесь рефакторить, или в автогенерируемых файлах. Для точечного игнорирования используйте комментарий # noqa: W293 на проблемной строке либо добавьте правило в секцию extend-ignore конфигурации flake8.
Однако учтите: у # noqa на пустой строке есть нюанс — сам комментарий делает строку непустой, поэтому для W293 чаще применяют игнорирование на уровне файла или конфигурации, а не построчно.
Почему линтеры вообще следят за пустыми строками
Стандарт PEP 8 требует, чтобы пустые строки были действительно пустыми. Причины практические: невидимые пробелы создают лишние изменения в diff при код-ревью, могут конфликтовать с настройками других редакторов и в редких случаях влияют на инструменты, анализирующие структуру файла. Единообразие упрощает чтение и сопровождение кода в команде.
Частые вопросы о W293
Ошибка W293 ломает выполнение программы?
Нет. Это стилистическое предупреждение линтера, а не ошибка интерпретатора. Код с W293 запускается и работает корректно — проблема касается только оформления и чистоты репозитория.
Как увидеть невидимые пробелы на пустой строке?
Включите отображение пробельных символов в редакторе. В VS Code это параметр editor.renderWhitespace, в других редакторах ищите опцию вида «Show whitespace» или «Показывать непечатаемые символы». Пробелы отобразятся точками, табуляции — стрелками.
Чем W293 отличается от W291?
W291 указывает на пробелы в конце строки, где есть код или комментарий. W293 — на пробелы на строке, которая должна быть полностью пустой. Оба исправляются одной командой Trim Trailing Whitespace.
Можно ли исправить W293 во всём проекте одной командой?
Да. Запустите autopep8 --in-place --recursive --select=W293 . из корня проекта или ruff check --select W293 --fix .. Перед этим убедитесь, что изменения закоммичены, чтобы при необходимости откатить правки.
Мешает ли W293 работе black или других форматтеров?
Нет, наоборот: black и подобные форматтеры сами удаляют пробелы с пустых строк при форматировании. Если вы уже используете black в проекте, предупреждение W293 обычно не возникает вовсе.