В разработке приложений программисты часто разбивают программу по логическим "узлам". Такой подход повышает читаемость и позволяет вести разработку в команде (каждый программист команды разрабатывает какой-то модуль проекта). Так рождается структура приложения, которая может стать достаточно большой (ветвистой и похожей на дерево).
Например, рассмотрим ветвистую структуру абстрактного пакета app
:
Существует 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 <>
.