Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
08 Мар 2024
2 мин
372

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

Одной из распространенных проблем, с которой сталкиваются новички при работе с Python, является понимание механизма относительных импортов. Проблема

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

Вот типичный пример такой ситуации. Имеются два файла: my_module.py, в котором определена функция my_function, и main.py, где эта функция необходима. Программист пытается импортировать функцию в main.py одним из следующих способов:

from .my_module import my_function

или

from my_module import my_function

Однако один из этих способов не работает и вызывает одну из следующих ошибок:

ImportError: attempted relative import with no known parent package
ModuleNotFoundError: No module named 'my_module'
SystemError: Parent module '' not loaded, cannot perform relative import

В чем же причина такого поведения?

Причина кроется в особенностях относительных импортов в Python. Относительные импорты работают только тогда, когда модуль является частью пакета. Пакет в Python — это каталог, содержащий файлы .py и специальный файл __init__.py, который может быть пустым, но должен присутствовать в каталоге.

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

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

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

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

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