Предупреждение 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 появляется в вашем коде?
Автоотступ редактора при нажатии Enter
Копирование кода извне
Работа в команде с разными настройками
Вообще не сталкивался

Как быстро найти и исправить W293

Самый простой способ — запустить линтер и пройтись по списку найденных строк. В терминале выполните:

flake8 --select=W293 your_project/

или

pycodestyle --select=W293 your_project/

Для ручного исправления достаточно удалить все символы на указанных строках, оставив их полностью пустыми. В большинстве редакторов есть команда Trim Trailing Whitespace, которая очищает пробелы сразу во всём файле — в том числе на пустых строках.

☑️ Устранение W293 за 5 минут

Выполнено: 0 / 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Линтер + фиксерДа, с --fixruff 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 обычно не возникает вовсе.