Что такое isort и как он используется в связке с black?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое isort и как он используется в связке с black?
isort — это инструмент автоматизации сортировки импортов в Python коде. Он организует импорты по определённым правилам, делая код более читаемым и согласованным. black — это форматер кода, который нормализует стиль кода. Вместе они образуют мощную комбинацию для обеспечения качества и консистентности кода.
Что делает isort?
isort сортирует и группирует импорты по следующим категориям:
# НЕПРАВИЛЬНО (без isort)
from django.shortcuts import render
import os
from myapp.models import User
import sys
from typing import List
from myapp.views import BaseView
# ПРАВИЛЬНО (после isort)
import os
import sys
from typing import List
from django.shortcuts import render
from myapp.models import User
from myapp.views import BaseView
Три группы импортов:
- Standard library — встроенные модули (os, sys, typing, etc.)
- Third-party — внешние библиотеки (django, requests, numpy, etc.)
- First-party — ваши собственные модули
Каждая группа отделена пустой строкой и отсортирована по алфавиту.
Установка и базовое использование
# Установка
pip install isort
pip install black # Установить и black
# Проверить файл
isort --check-only myfile.py
# Форматировать файл
isort myfile.py
# Форматировать весь проект
isort .
# Показать изменения без применения
isort --diff myfile.py
Конфигурация isort
pyproject.toml (рекомендуемый способ):
[tool.isort]
profile = "black" # ВАЖНО: совместимость с black
line_length = 88 # Соответствует черту в black
skip_gitignore = true
multi_line_mode = 3 # Vertical hanging indent
include_trailing_comma = true
force_single_line = false
# Игнорировать определённые пути
ignore_paths = ["migrations/", "venv/"]
# Известные первые пакеты (для правильной классификации)
known_django = ["django"]
known_first_party = ["myapp", "accounts", "core"]
setup.cfg (альтернативный способ):
[isort]
profile=black
line_length=88
include_trailing_comma=True
use_parentheses=True
ensure_newline_before_comments=True
Примеры трансформаций isort
# Пример 1: Неправильный порядок
# БЫЛО:
from typing import Optional
import requests
from django.db import models
import json
from myapp.models import Post
# СТАЛО (после isort):
import json
from typing import Optional
import requests
from django.db import models
from myapp.models import Post
# Пример 2: Длинные импорты с множеством элементов
# БЫЛО:
from django.contrib.auth.models import User, Group, Permission
from typing import Dict, List, Optional, Tuple, Union
# СТАЛО (с включением trailing comma):
from typing import (
Dict,
List,
Optional,
Tuple,
Union,
)
from django.contrib.auth.models import (
Group,
Permission,
User,
)
Связка isort + black
Важно: isort и black должны быть совместимы! Используйте профиль black в isort:
[tool.isort]
profile = "black" # Это критично!
line_length = 88
[tool.black]
line-length = 88
Использование в pre-commit hook
.pre-commit-config.yaml:
repos:
# isort должен быть ПЕРЕД black
- repo: https://github.com/PyCQA/isort
rev: 5.13.2
hooks:
- id: isort
args: [--profile=black]
- repo: https://github.com/psf/black
rev: 23.12.0
hooks:
- id: black
language_version: python3.11
ВАЖНО: isort должен быть первым, потом black!
Использование в CI/CD pipeline
# GitHub Actions
name: Code Quality
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# Проверить импорты
- name: Run isort
uses: isort/isort-action@master
with:
args: --check-only
# Проверить форматирование
- name: Run black
uses: psf/black@23.3.0
with:
args: --check
Интеграция с IDE
VS Code — добавить в .vscode/settings.json:
{
"python.linting.enabled": true,
"python.formatting.provider": "black",
"python.linting.flake8Enabled": true,
"[python]": {
"editor.defaultFormatter": "ms-python.python",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
},
"python.linting.isortArgs": ["--profile=black"]
}
PyCharm — встроенная поддержка:
- Settings → Editor → Code Style → Python → Imports
- Включить сортировку импортов
- Использовать профиль, совместимый с black
Полный пример: настройка проекта
# pyproject.toml
[tool.poetry]
name = "myproject"
version = "0.1.0"
python = "^3.11"
[tool.poetry.dependencies]
django = "^5.0"
requests = "^2.31"
[tool.poetry.group.dev.dependencies]
black = "^23.12"
isort = "^5.13"
flake8 = "^6.0"
pytest = "^7.4"
[tool.black]
line-length = 88
target-version = ['py311']
include = '\.pyi?$'
[tool.isort]
profile = "black"
line_length = 88
known_first_party = ["myapp", "accounts"]
known_django = ["django"]
include_trailing_comma = true
use_parentheses = true
ensure_newline_before_comments = true
skip_gitignore = true
[tool.pytest.ini_options]
python_files = "tests.py test_*.py *_tests.py"
addopts = "--strict-markers --cov=myapp"
Скрипт для быстрого форматирования
#!/bin/bash
# format.sh - форматировать весь проект
echo "Running isort..."
isort . --profile=black
echo "Running black..."
black . --line-length 88
echo "✅ Code formatted successfully!"
Распространённые проблемы
# Проблема 1: Конфликт с black если не использовать profile="black"
# РЕШЕНИЕ: всегда используйте profile="black" в isort
# Проблема 2: SKIP файл не игнорируется
# РЕШЕНИЕ: явно указать в ignore_paths
isort --skip=migrations --skip=venv .
# Проблема 3: Импорты из относительных путей
# БЫЛО:
from ...models import User
# СТАЛО (после isort + правильной конфигурации):
from ... import models
from ...models import User
Сравнение с другими инструментами
| Инструмент | Назначение | Комбинируется |
|---|---|---|
| isort | Сортировка импортов | с black, flake8 |
| black | Форматирование кода | с isort, flake8 |
| flake8 | Поиск ошибок стиля | с isort, black |
| pylint | Анализ кода | с isort, black |
| autopep8 | Автоматический фиксер | с isort |
Вывод
isort — это:
- Инструмент для автоматической сортировки импортов
- Делит импорты на 3 группы: standard, third-party, first-party
- КРИТИЧНО использовать профиль
blackдля совместимости - Интегрируется с IDE и CI/CD pipeline
- Часть современного workflow развития на Python
- Вместе с black обеспечивает консистентность кода в команде