← Назад к вопросам

Что такое flake8 и какие проблемы помогает выявить?

2.0 Middle🔥 181 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

flake8: линтер для проверки кода на стиль и ошибки

flake8 — это инструмент для статического анализа кода Python, который проверяет соответствие стилю кодирования, ошибки синтаксиса и проблемы логики. Это комбинация трёх инструментов: PyCodeStyle (PEP 8), PyFlakes и McCabe complexity.

Что такое flake8

flake8 автоматически проверяет код и выявляет проблемы без выполнения кода. Это экономит время на код-ревью и помогает поддерживать единый стиль в команде.

Установка

# Через pip
$ pip install flake8

# Проверить установку
$ flake8 --version
5.0.4 (mccabe: 0.7.0, pycodestyle: 2.9.0, pyflakes: 2.5.0)

Что выявляет flake8

1. Ошибки стиля (PEP 8) — через pycodestyle

# ❌ Плохо
def foo( a,b,c ):
    x=a+b+c
    return x

# ✅ Хорошо
def foo(a, b, c):
    x = a + b + c
    return x

Коды ошибок стиля:

  • E2 — Whitespace (пробелы)
  • E3 — Blank line (пустые строки)
  • E4 — Import (импорты)
  • E7 — Statement (операторы)
  • W1, W2, W3, W6 — Warnings (предупреждения)

2. Неиспользуемые переменные — через pyflakes

# ❌ Плохо
import os  # Не используется
x = 10
print(5)  # x не используется

# ✅ Хорошо
print(5)

Коды ошибок pyflakes:

  • F4 — ImportError
  • F8 — Undefined name
  • F9 — Syntax error

3. Сложность кода — через McCabe

# ❌ Слишком сложно (cyclomatic complexity > 10)
def complex_function(x):
    if x == 1:
        if y == 2:
            if z == 3:
                if a == 4:
                    if b == 5:
                        return True  # 5 уровней вложенности!
    return False

# Код C901: 'complex_function' is too complex (11)

Код ошибки:

  • C901 — Complexity

Запуск flake8

Проверить один файл:

$ flake8 my_script.py
my_script.py:1:1: E302 expected 2 blank lines, found 1
my_script.py:3:5: E251 unexpected spaces around keyword / parameter equals
my_script.py:5:1: F841 local variable 'x' is assigned to but never used

Проверить всю папку:

$ flake8 .
project/main.py:10:1: E265 block comment should start with '# '
project/utils.py:5:1: F401 'os' imported but unused
project/models.py:20:1: C901 'calculate' is too complex (12)

Проверить и показать статистику:

$ flake8 . --statistics
1     E302 expected 2 blank lines, found 1
2     E501 line too long (120 > 79 characters)
1     F401 module imported but unused

Показать количество проблем по коду:

$ flake8 . --count
15

Примеры ошибок, которые выявляет flake8

Пример 1: Неиспользуемый импорт

# ❌ bad_code.py
import os
import sys

def hello():
    print("Hello")  # os и sys не используются

hello()

# Ошибка flake8
# bad_code.py:1:1: F401 'os' imported but unused
# bad_code.py:2:1: F401 'sys' imported but unused

Пример 2: Переменная присвоена, но не использована

# ❌ bad_code.py
def calculate(a, b):
    result = a + b  # Присвоена, но не возвращена
    print(f"Sum: {a} + {b}")

# Ошибка flake8
# bad_code.py:2:5: F841 local variable 'result' is assigned to but never used

Пример 3: Пробелы вокруг оператора

# ❌ bad_code.py
x=10+20
y = 30+40

# Ошибки flake8
# bad_code.py:1:1: E225 missing whitespace around operator
# bad_code.py:2:7: E225 missing whitespace around operator

Пример 4: Слишком длинная строка

# ❌ bad_code.py
very_long_variable_name = "This is a very long string that exceeds the 79 character limit and will cause an error"

# Ошибка flake8
# bad_code.py:1:1: E501 line too long (105 > 79 characters)

Пример 5: Сложная функция

# ❌ bad_code.py
def validate_user(user):
    if user.age < 18:
        if user.country == 'US':
            if not user.parent_consent:
                if user.has_credit_card:
                    if not user.verified_email:
                        return False
    return True

# Ошибка flake8
# bad_code.py:1:1: C901 'validate_user' is too complex (6)

Конфигурация flake8

Создайте файл .flake8 в корне проекта:

[flake8]
max-line-length = 120
ignore = E203, W503, F401  # Игнорируем эти ошибки
exclude = .git,__pycache__,docs,venv,.venv
max-complexity = 10

Или в setup.cfg:

[flake8]
max-line-length = 120
ignore = E501,W503
exclude = venv,__pycache__,.git

Или в pyproject.toml (для flake8 9.0+):

[tool.flake8]
max-line-length = 120
ignore = ["E203", "W503"]
exclude = ["venv", "__pycache__"]
max-complexity = 10

Использование в разработке

1. Перед каждым коммитом:

#!/bin/bash
# pre-commit hook
flake8 .
if [ $? -ne 0 ]; then
    echo "flake8 failed. Fix issues before committing."
    exit 1
fi

2. В CI/CD пайпелайне:

# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs:
  flake8:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - run: pip install flake8
      - run: flake8 .

3. В IDE (VS Code, PyCharm):

// .vscode/settings.json
{
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": [
    "--max-line-length=120"
  ]
}

flake8 vs черные инструменты

ИнструментНазначение
flake8Проверка стиля и ошибок (не исправляет)
blackАвтоматическое форматирование
pylintБолее строгая проверка (часто много false positives)
ruffБыстрый линтер (написан на Rust)

Рекомендуемая комбинация:

# Форматирование кода
$ black .

# Проверка стиля и ошибок
$ flake8 .

# Поиск сложных ошибок
$ pylint project/

Игнорирование ошибок

Одна строка:

x = 1  # noqa: E501  # Игнорирует E501 на этой строке

Весь файл:

# flake8: noqa  # Игнорирует все ошибки в файле

import os  # F401 будет пропущена

Вывод

flake8 — это незаменимый инструмент для поддержания качества Python кода. Используй его в каждом проекте для:

  • Соблюдения PEP 8
  • Обнаружения неиспользуемого кода
  • Контроля сложности
  • Выяснения логических ошибок (undefined names)

Оно экономит часы на код-ревью и предотвращает баги ещё до того, как код попадёт в production.