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

Какие линтеры и инструменты качества кода используешь при разработке?

1.0 Junior🔥 81 комментариев
#Python Core

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

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

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

Инструменты качества кода в Python: Полный стек

Для написания высококачественного, maintainable кода я использую комплексный подход с несколькими инструментами, каждый из которых решает определённую задачу.

1. Линтеры и форматеры

Ruff (основной инструмент)

Быстрая, современная альтернатива flake8 + pylint + isort.

# pyproject.toml конфигурация
[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings
    "F",    # Pyflakes
    "I",    # isort
    "N",    # pep8-naming
    "UP",   # pyupgrade
    "B",    # flake8-bugbear
    "A",    # flake8-builtins
    "C4",   # flake8-comprehensions
    "SIM",  # flake8-simplify
]
ignore = ["E501"]  # line too long (handled by formatter)

[tool.ruff.lint.isort]
known-first-party = ["myapp"]

В командной строке:

ruff check .           # Проверить код
ruff format .          # Автоформатирование
ruff check --fix .     # Автоисправление

Black (форматер кода)

Строгий, непреклонный форматер: "единственный стиль — правильный".

# .flake8 или pyproject.toml
[tool.black]
line-length = 100
target-version = [py311]
extend-exclude = .venv

# Использование
# black .

Особенность: конфликты Black и Ruff решаются игнорированием line-length в Ruff.

2. Type Checking

Mypy (статическая типизация)

Проверяет типы без запуска кода — ловит ошибки на этапе разработки.

# mypy.ini
[mypy]
python_version = "3.11"
warn_return_any = True
warn_unused_configs = True
disallow_untyped_defs = True
check_untyped_defs = True

# Пример кода
from typing import Optional

def get_user(user_id: int) -> Optional[dict]:
    if user_id < 0:
        return None
    return {"id": user_id, "name": "John"}

user: dict = get_user(1)  # ✅ Правильно
user: str = get_user(1)   # ❌ mypy ловит ошибку типа
mypy .

Pyright (альтернатива, быстрее)

От Microsoft, более строгие проверки, быстрее работает.

// pyrightconfig.json
{
  "typeCheckingMode": "strict",
  "pythonVersion": "3.11"
}

3. Тестирование и покрытие

Pytest (фреймворк тестирования)

Стандарт индустрии с огромной экосистемой плагинов.

# conftest.py (общие фиксчуры)
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

@pytest.fixture
def db_session():
    engine = create_engine("sqlite:///:memory:")
    Session = sessionmaker(bind=engine)
    session = Session()
    yield session
    session.close()

# test_user.py
def test_create_user(db_session):
    user = create_user(db_session, name="John")
    assert user.name == "John"
    assert user.id is not None

Запуск:

pytest                      # Все тесты
pytest -v                   # Verbose
pytest --cov=app           # С покрытием
pytest -k "test_user"      # Конкретный тест
pytest --lf                # Только упавшие

Coverage.py (измерение покрытия)

Отслеживает, какой процент кода покрыт тестами.

coverage run -m pytest
coverage report              # Консольный отчёт
coverage html                # HTML-отчёт в htmlcov/
# .coveragerc
[run]
branch = True
omit =
    */tests/*
    */migrations/*

[report]
precision = 2
show_missing = True
skip_covered = False
skip_empty = True
skip_lines =
    pragma: no cover
    def __repr__

4. Безопасность

Bandit (поиск уязвимостей)

Сканирует код на классические security issues.

bandit -r . -ll             # recursive, только HIGH/CRITICAL
bandit -r app/ -f json      # JSON-формат для CI/CD

Примеры находок:

# ❌ SQL injection
query = f"SELECT * FROM users WHERE id = {user_id}"

# ❌ Hardcoded secrets
API_KEY = "sk_live_abc123xyz"

# ❌ Unsafe pickle
import pickle
data = pickle.loads(untrusted_data)  # Опасно!

Safety (проверка зависимостей)

Проверяет requirements на known vulnerabilities.

safety check
safety check --json

5. Сложность кода

Radon (метрики кода)

Cyclomatic complexity, maintainability index.

radon cc app/                    # Cyclomatic complexity
radon mi app/ -s                 # Maintainability index
radon metrics app/ --total       # Общие метрики
# Пример высокой сложности (плохо)
def process(x):
    if x > 0:
        if x > 10:
            if x > 100:
                if x > 1000:
                    return "huge"
                return "big"
            return "medium"
        return "small"
    return "negative"

# Лучше (guard clause)
def process(x):
    if x <= 0:
        return "negative"
    if x <= 10:
        return "small"
    if x <= 100:
        return "medium"
    if x <= 1000:
        return "big"
    return "huge"

6. Документирование и стиль

Pydocstyle (проверка docstrings)

Убеждается, что документация соответствует стандарту.

pydocstyle app/

Interrogate (покрытие документацией)

Какой процент функций имеют docstrings.

interrogate -vv app/
interrogate -g app/  # Generate badge

Полный пайплайн в Makefile

.PHONY: lint test quality

lint:
	@echo "🔍 Ruff check..."
	ruff check .
	@echo "🎨 Black format check..."
	black --check .
	@echo "🏷️ Mypy type check..."
	mypy .

test:
	@echo "🧪 Running tests..."
	pytest --cov=app --cov-report=html

quality: lint test
	@echo "🔐 Security check..."
	bandit -r app/ -ll
	@echo "📊 Code metrics..."
	radon cc app/ --min=B

В CI/CD:

# .github/workflows/quality.yml
name: Code Quality
on: [push, pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
      - run: pip install ruff black mypy bandit
      - run: ruff check .
      - run: mypy .
      - run: bandit -r app/

Мой личный стек (production)

  1. Ruff — основной линтер + форматирование
  2. Mypy (strict) — статическая типизация
  3. Pytest с coverage > 90% — тестирование
  4. Bandit — безопасность
  5. Pre-commit hooks — автоматическая проверка перед коммитом

Этот комплекс даёт уверенность в качестве кода и предотвращает ошибки на ранних стадиях.

Какие линтеры и инструменты качества кода используешь при разработке? | PrepBro