Сообщить об ошибке.

Относительный/абсолютный импорт пакетов

В разработке приложений программисты часто разбивают программу по логическим "узлам". Такой подход повышает читаемость и позволяет вести разработку в команде (каждый программист команды разрабатывает какой-то модуль проекта). Так рождается структура приложения, которая может стать достаточно большой (ветвистой и похожей на дерево).

Например, рассмотрим ветвистую структуру абстрактного пакета app:

  • main.py
    • app (каталог)
      • observer (каталог)
        • schedule.py
        • ...
      • handlers (каталог)
        • auth.py
        • ...
      • ...
    • ...
  • ...

Существует 2 подхода импортирования (лучше придерживаться одного во всем проекте):

  • Именованный (абсолютный)
  • Неименованный (относительный)

Пример абсолютного импорта модулей из директории observer в модуль auth.py:

# импорт в файле `auth.py` 
from app.observer import schedule

Пример относительного импорта модулей из директории observer в auth.py:

# импорт в файле `auth.py` 
from ..observer import schedule

Количество точек указывает на сколько (обьектов) мы поднимаемся от исходного. В данном примере первая точка поднимает на уровень handlers, а вторая точка поднимает на уровень app

Это два абсолютно разных подхода. В первом случае "опускаемся" от "корня" (папка app). Во втором случае "поднимаемся" к "корню" (папка app) от файла, в котором происходит импорт.

Абсолютный импорт может использовать синтаксис import <> или from <> import <>, но относительный импорт может использовать только вторую форму from <> import <>.