Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
07 Июл 2023
2 мин
1391

Относительные импорты в Python

Часто разработчики сталкиваются с ситуацией, когда в проекте Python есть различные подпакеты, и один подпакет нуждается в доступе к классам или функциям

Часто разработчики сталкиваются с ситуацией, когда в проекте Python есть различные подпакеты, и один подпакет нуждается в доступе к классам или функциям из другого подпакета. Например, может быть следующая структура каталогов:

project/
   __init__.py
   package1/
      __init__.py
      module1.py
   package2/
      __init__.py
      module2.py

В данной ситуации, может возникнуть необходимость использовать функции или классы из module2.py в module1.py. В Python для этого существуют относительные импорты.

Однако, при попытке импортировать модуль из соседнего подпакета с помощью относительного импорта вида from ..package2 import module2, часто возникает ошибка «Attempted relative import in non-package».

Эта ошибка возникает из-за того, что Python ожидает, что относительный импорт будет выполнен внутри пакета. Пакетом в Python считается любой каталог, содержащий файл __init__.py.

Поэтому, чтобы исправить данную ошибку, необходимо убедиться, что файл, выполняющий относительный импорт, находится внутри пакета. В приведенном выше примере, необходимо убедиться, что module1.py находится внутри пакета package1, который в свою очередь находится внутри пакета project.

Если все пакеты и модули расположены правильно, относительный импорт должен выполняться без ошибок. Однако, стоит помнить, что относительные импорты работают только тогда, когда скрипт запущен как модуль, а не как главный скрипт программы. Если же относительный импорт выполняется в главном скрипте программы, Python не сможет определить, относительно чего должен быть выполнен импорт, и выдаст ошибку.

В качестве альтернативы относительным импортам, можно использовать абсолютные импорты, которые указывают полный путь до импортируемого модуля, начиная от корневого каталога проекта. В приведенном выше примере, вместо from ..package2 import module2 можно использовать from project.package2 import module2.

Однако, использование абсолютных импортов требует более тщательного управления структурой проекта и может привести к проблемам, если структура каталогов проекта изменится.

Добавить комментарий

Подарок
Забрать подарок