Какие знаешь способы автоматизации проверки кода линтерами?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Автоматизация проверки кода линтерами
Линтеры — это инструменты, которые анализируют исходный код и выявляют ошибки, нарушения стиля, потенциальные баги и нарушения лучших практик. Автоматизация проверки критична для поддержания качества в team-е.
Основные линтеры для Python
1. Ruff — быстрая полиция стиля
Современный линтер, написанный на Rust, заменяет flake8, isort, pylint в одном пакете.
# pyproject.toml
[tool.ruff]
line-length = 100
target-version = "py311"
[tool.ruff.lint]
select = [
"E", # PyCodeStyle ошибки
"W", # Warnings
"F", # Pyflakes (неиспользуемые импорты, undefined names)
"I", # isort (организация импортов)
"C", # Complexity
"D", # Docstrings
"RUF", # Ruff-специфичные правила
]
ignore = ["D100", "D101"] # Игнорируем требование docstring для модулей/классов
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["D100", "D101", "D102"] # В тестах не требуем docstrings
"__init__.py" = ["F401"] # Импорты в __init__ могут быть неиспользованы
# Запуск ruff
ruff check src/
ruff format src/ # Автоматическое форматирование
2. Pylint — углубленный анализ
Проверяет не только стиль, но и логические ошибки, потенциальные баги.
# .pylintrc
[MASTER]
disable=missing-docstring,too-few-public-methods
max-line-length=100
[BASIC]
good-names=i,j,k,x,y,z,f,df,_
pylint src/
3. Mypy — проверка типов
Гарантирует type-safety в Python коде.
# mypy.ini
[mypy]
python_version = 3.11
warn_return_any = True
warn_unused_configs = True
disallow_untyped_defs = True
disallow_incomplete_defs = True
no_implicit_optional = True
mypy src/
4. Black — форматер кода
Особенность: не дающий выбора, "opinionated" форматер. Все спорят с ним, но это гарантирует единообразие.
black src/
Автоматизация через Git Hooks
Pre-commit hooks
Pre-commit — фреймворк для управления git hooks. Запускает проверки перед коммитом.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.8
hooks:
- id: ruff
args: [--fix] # Автоисправление
- id: ruff-format
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
args: ["--maxkb=1000"]
- id: debug-statements
language: python
- id: mixed-line-ending
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0
hooks:
- id: mypy
additional_dependencies: [types-all]
args: [--strict]
- repo: https://github.com/PyCQA/pylint
rev: pylint-3.0.3
hooks:
- id: pylint
# Установка
pip install pre-commit
pre-commit install
# Ручной запуск
pre-commit run --all-files
# На каждый коммит автоматически запустится
git commit -m "My changes" # pre-commit hooks run, fix issues, then commit
Автоматизация через CI/CD
GitHub Actions
# .github/workflows/lint.yml
name: Lint and Type Check
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
- name: Install dependencies
run: |
pip install --upgrade pip
pip install ruff mypy pylint
- name: Run Ruff
run: ruff check src/ tests/
- name: Run Ruff Format Check
run: ruff format --check src/ tests/
- name: Run Mypy
run: mypy src/
- name: Run Pylint
run: pylint src/ --fail-under=8.0
GitLab CI
# .gitlab-ci.yml
stages:
- lint
lint:
stage: lint
image: python:3.11
script:
- pip install ruff mypy pylint
- ruff check src/
- mypy src/
- pylint src/
only:
- merge_requests
- main
Jenkins Pipeline
pipeline {
agent any
stages {
stage("Lint") {
steps {
sh """
pip install ruff mypy
ruff check src/
mypy src/
"""
}
}
}
post {
always {
step([$class: "PublishHTML",
reportDir: "reports",
reportFiles: "lint-report.html"])
}
}
}
Интеграция в IDE
VSCode
// .vscode/settings.json
{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll": "explicit"
}
},
"ruff.lint.args": ["--extend-select=I"],
"mypy-type-checker.args": ["--strict"]
}
PyCharm
- Preferences → Editor → Code Style → Python → Ruff
- Preferences → Tools → Python Integrated Tools → Default linter → Pylint
- Enable "Run linter on save"
Практический пример: Makefile
Удобно централизовать все команды:
.PHONY: lint format type-check lint-all test
lint:
@echo "Running Ruff..."
ruff check src/ tests/
@echo "✓ Ruff passed"
format:
@echo "Formatting code..."
ruff format src/ tests/
type-check:
@echo "Running Mypy..."
mypy src/
@echo "✓ Type checks passed"
lint-all: lint type-check
@echo "✓ All checks passed!"
test: lint-all
@echo "Running tests..."
pytest tests/ -v --cov=src
# Запуск при коммите
pre-commit-install:
pre-commit install
make lint # Только ruff
make type-check # Только mypy
make lint-all # Все проверки
make test # Проверки + тесты
Практические рекомендации
- Не игнорируй ошибки —
# noqaи# type: ignoreтолько для обоснованных случаев. - Strict mode — включи самые строгие проверки (
mypy --strict,pylint 9.0+). - Консистентность в team-е — все используют одну конфигурацию.
- CI/CD блокирует merge — pull request не мёржится, если не прошли проверки.
- Автоисправление —
ruff --fix,black,isortэкономят время. - Pre-commit hooks — ловят проблемы до отправки на сервер.
Результат правильной автоматизации
✅ Код всегда соответствует стилю ✅ Баги выявляются ранше ✅ Type-safety гарантируется ✅ Code review быстрее (не обсуждаем стиль) ✅ Новички быстрее адаптируются
В моих проектах линтеры — первое, что я настраиваю, потому что они сохраняют время всей команде.