__init__.py
).from . import имя_модуля
(для импорта модуля в том же пакете) или from .. import имя_модуля
(для импорта модуля из родительского пакета). Количество точек указывает уровень иерархии.python -m mypackage.mymodule
).Относительные импорты используются для импорта модулей, находящихся в том же пакете, без необходимости указывать полный путь к пакету.
Как они работают:
Относительные импорты начинаются с одной или нескольких точек (.
).
Одна точка (.
) означает текущий каталог (относительно модуля, в котором делается импорт).
Две точки (..
) означают родительский каталог.
Три точки (...
) означают каталог, находящийся на два уровня выше и так далее.
Пример структуры пакета:
my_package/
├── __init__.py
├── module_a.py
└── subpackage/
├── __init__.py
└── module_b.py
Примеры использования относительных импортов:
В module_b.py (внутри subpackage):
# Импортирует module_a из родительского пакета (my_package)
from .. import module_a
# Импортирует что-то конкретное из module_a
from ..module_a import my_function
# Импортирует текущий модуль subpackage
from . import some_local_function
# Или тоже самое по имени, но без необходимости знать __init__.py:
from . import module_b
В module_a.py (внутри my_package):
# Импортирует module_b из подпакета subpackage
from .subpackage import module_b
# Импортирует что-то конкретное из module_b
from .subpackage.module_b import another_function
Важно:
Относительные импорты работают только внутри пакетов. Пакет определяется наличием файла __init__.py
в директории.
Нельзя использовать относительные импорты в скрипте, который запускается напрямую (например, python module_a.py
). В этом случае Python считает, что это не часть пакета, и относительные импорты работать не будут. Нужно запускать модуль как часть пакета (например, используя python -m my_package.module_a
).
Рекомендуется использовать абсолютные импорты везде, где это возможно. Относительные импорты полезны для рефакторинга и переноса кода внутри пакета, но при этом они могут сделать код менее читаемым и сложным в поддержке, если используются чрезмерно.
Преимущества относительных импортов:
Упрощают перенос и рефакторинг кода внутри пакета.
Делают код более независимым от абсолютного пути к пакету.
Недостатки относительных импортов:
Могут сделать код менее читаемым, особенно при использовании множества точек.
Могут привести к проблемам при запуске скриптов напрямую.
Сложность в понимании того, какой модуль импортируется, не зная структуру пакета.