Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Порядок импортов в Python
Порядок импортов в Python — это не просто вопрос стиля кода, это стандарт PEP 8, который помогает поддерживать читаемость и консистентность проекта. Правильный порядок критичен при работе в команде.
Стандартный порядок импортов (PEP 8)
По стандарту Python импорты должны быть организованы в три группы, разделенные пустыми строками:
# 1. Стандартная библиотека Python
import os
import sys
import json
from datetime import datetime
from typing import List, Dict, Optional
# 2. Сторонние библиотеки (installed via pip)
import django
import requests
import numpy as np
from flask import Flask, render_template
from sqlalchemy import Column, String
# 3. Локальные модули вашего приложения
from .models import User
from .utils import helper_function
from myapp.config import settings
Три группы импортов подробно
Группа 1: Стандартная библиотека (Standard Library)
Это модули, которые поставляются вместе с Python:
import os
import sys
import json
import re
import hashlib
from pathlib import Path
from datetime import datetime, timedelta
from typing import List, Dict, Optional, Union
from collections import defaultdict
from functools import wraps, reduce
from itertools import chain, combinations
import asyncio
import threading
Этого большинство импортов в типичном файле.
Группа 2: Сторонние библиотеки (Third-party)
Это библиотеки, установленные через pip:
import django
import requests
import numpy as np
import pandas as pd
from flask import Flask, render_template
from sqlalchemy import Column, String, create_engine
from pydantic import BaseModel, Field
from fastapi import FastAPI, HTTPException
from celery import Celery
Группа 3: Локальные импорты (Local/Relative)
Это модули вашего приложения:
# Абсолютные импорты из вашего приложения
from myapp.models import User
from myapp.utils import helper_function
from myapp.config import settings
# Или относительные импорты
from .models import User # то же самое, что из текущего пакета
from ..utils import helper # из родительского пакета
Полный пример с правильным порядком
# Стандартная библиотека
import json
import logging
import os
from datetime import datetime
from pathlib import Path
from typing import List, Dict, Optional
# Сторонние библиотеки
import requests
import sqlalchemy as sa
from flask import Flask, jsonify
from pydantic import BaseModel, ValidationError
# Локальные модули
from .models import User, Post
from .utils import cache_result
from .config import DATABASE_URL
# Остальной код...
Сортировка внутри групп
Внутри каждой группы импорты должны быть отсортированы алфабетически:
# ❌ ПЛОХО: не отсортировано
from typing import Dict, Optional, List
# ✅ ХОРОШО: отсортировано
from typing import Dict, List, Optional
# ❌ ПЛОХО: не отсортировано
import sys
import os
import json
# ✅ ХОРОШО: отсортировано
import json
import os
import sys
from import vs import
Оба стиля допускаются, но есть рекомендации:
# ✅ Для отдельных функций/классов: from import
from pathlib import Path
from datetime import datetime
from typing import List, Dict
# ✅ Для модулей/пакетов: import
import os
import sys
import json
# ❌ Избегай: from X import *
from typing import * # не делай так!
# ✅ Исключение: star imports только для очень специфических случаев
# например, в __init__.py для переэкспорта
from .models import * # может быть OK в __init__.py
Инструменты для автоматизации порядка
В реальных проектах используются инструменты для автоматического форматирования импортов:
Инструмент 1: isort
Мост популярный инструмент для сортировки импортов:
# Установка
pip install isort
# Использование
isort myfile.py
isort .
# Проверка (без изменений)
isort --check-only myfile.py
# pyproject.toml
[tool.isort]
profile = "black" # совместимость с Black formatter
line_length = 88
skip_gitignore = true
Инструмент 2: ruff (современный инструмент)
pip install ruff
ruff check --select I myfile.py # проверка импортов
ruff check --fix myfile.py # автоисправление
Инструмент 3: flake8 + flake8-isort
pip install flake8 flake8-isort
flake8 myfile.py # проверит порядок импортов
Интеграция с IDE
Модернные IDE автоматически организуют импорты:
PyCharm:
Settings → Editor → Code Style → Imports → Arrange imports
VS Code:
{
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
}
}
Практический пример: перед и после
# ❌ ПЛОХО: неправильный порядок
from myapp.models import User
import numpy as np
from datetime import datetime
import os
from myapp.utils import helper
import requests
from typing import List
# ✅ ХОРОШО: правильный порядок
import os
from datetime import datetime
from typing import List
import numpy as np
import requests
from myapp.models import User
from myapp.utils import helper
Частые ошибки
Ошибка 1: Импорты в середине кода
# ❌ ПЛОХО
def get_user(user_id):
from myapp.models import User # импорт внутри функции!
return User.objects.get(id=user_id)
# ✅ ХОРОШО
from myapp.models import User
def get_user(user_id):
return User.objects.get(id=user_id)
Исключение: отложенный импорт для экономии памяти:
def large_computation():
import numpy # импортируем только когда нужно
return numpy.array([1, 2, 3])
Ошибка 2: Циклические импорты
# models.py
from .views import render_user
class User:
pass
# views.py
from .models import User
def render_user(user):
return str(user)
Основной способ решить: переместить импорт внутрь функции:
# models.py
class User:
def render(self):
from .views import render_user # импорт внутри
return render_user(self)
Ошибка 3: Пустые импорты
# ❌ ПЛОХО
import unused_module
# ✅ ХОРОШО
# удалить импорт или использовать noqa
import unused_module # noqa: F401 (если действительно нужен)
Django специфика
Django проекты часто имеют специальный порядок:
# Стандартная библиотека
import os
from datetime import datetime
# Django
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
# Сторонние пакеты
from rest_framework import serializers
# Локальные импорты
from .models import User
from .utils import helper
FastAPI/Pydantic примеры
# Стандартная библиотека
from datetime import datetime
from typing import List, Optional
# Сторонние
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from sqlalchemy import Column, String
# Локальные
from .database import get_db
from .config import settings
app = FastAPI()
Итоговый чеклист
- Три группы (стандартная, сторонние, локальные)
- Пустые строки между группами
- Алфавитный порядок внутри каждой группы
- Нет звездочек (от
from X import *) - Импорты вверху файла (редкие исключения для отложенной загрузки)
- Используешь isort или ruff для автоматизации
- IDE настроена на автоматическое расположение импортов
Этот порядок импортов делает ваш код более читаемым, консистентным и профессиональным.