Какие линтеры и инструменты качества кода используешь при разработке?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Инструменты качества кода в 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)
- Ruff — основной линтер + форматирование
- Mypy (strict) — статическая типизация
- Pytest с coverage > 90% — тестирование
- Bandit — безопасность
- Pre-commit hooks — автоматическая проверка перед коммитом
Этот комплекс даёт уверенность в качестве кода и предотвращает ошибки на ранних стадиях.