В чем разница между Black и Flake8 в Python?
Что проверяют
Понимаете ли вы, что это инструменты разного класса: один переписывает код, другой только сообщает о проблемах. Следом обычно спрашивают, как подружить их в одном проекте и не заменил ли их у вас уже Ruff.
Как отвечать
Начните с главного различия, потом раскройте детали:
- Black: форматтер. Сам переписывает файлы под единый стиль: переносы, отступы, кавычки, запятые в конце многострочных конструкций. Настроек почти нет намеренно: длина строки (по умолчанию 88), целевые версии Python, отключение нормализации кавычек. Логику кода не проверяет вообще;
- Flake8: линтер. Код не меняет, выдаёт список замечаний с кодами. Это обёртка над
pycodestyle(стиль PEP 8, кодыEиW),pyflakes(неиспользуемый импорт, неопределённое имя, кодыF) иmccabe(цикломатическая сложность,C901). Расширяется плагинами, напримерflake8-bugbear; - вместе: Black снимает споры о стиле, Flake8 ловит то, что форматированием не исправить. Но они конфликтуют: Flake8 по умолчанию ждёт строку в 79 символов и ругается на
E203(пробел перед двоеточием в срезе), который ставит Black. Поэтому в конфиг Flake8 пишутmax-line-length = 88и добавляют вextend-ignoreкак минимумE203; - в CI:
black --check .падает на неотформатированном файле,flake8на любом замечании. Локально оба обычно висят вpre-commit.
Хорошо добавить, что многие проекты перешли на Ruff: ruff format почти полностью совместим с Black, а ruff check реализует правила Flake8 и популярных плагинов и работает на порядок быстрее.
Где спотыкаются
Говорят, что Black найдёт неиспользуемый импорт. Не найдёт: он форматирует синтаксическое дерево, а не анализирует смысл.
Утверждают, что Flake8 настраивается в pyproject.toml. Штатно он читает только setup.cfg, tox.ini и .flake8, для pyproject.toml нужен отдельный плагин.
Забывают про сортировку импортов: Black её не делает, для этого нужен isort с profile = black или правило I в Ruff.