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

Что такое isort и как он используется в связке с black?

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

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

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

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

Что такое 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

Три группы импортов:

  1. Standard library — встроенные модули (os, sys, typing, etc.)
  2. Third-party — внешние библиотеки (django, requests, numpy, etc.)
  3. 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 обеспечивает консистентность кода в команде