Как импортировать модуль в рамках пакета?

Существует несколько способов импортировать модуль в рамках пакета в Python:
  • Абсолютный импорт: import package.module (указывается полный путь от корня проекта).
  • Относительный импорт (внутри пакета):
    • from . import module (импорт модуля в том же пакете).
    • from .. import module (импорт модуля из родительского пакета).
    • from .module import some_function (импорт конкретной функции из модуля в том же пакете).
    Относительный импорт обычно используется внутри модулей пакета.
Рекомендуется использовать абсолютный импорт для большей читаемости и предсказуемости, особенно в больших проектах. Относительный импорт полезен для связывания модулей внутри пакета, когда структура пакета может меняться.

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

  my_package/
  ├── __init__.py
  ├── module_a.py
  └── sub_package/
      ├── __init__.py
      └── module_b.py
  

Вот несколько способов импорта module_b в module_a:

  1. Относительный импорт (Relative imports): Это наиболее рекомендуемый способ, особенно внутри пакетов. Он указывает, где находится модуль относительно текущего модуля.
    # my_package/module_a.py
    from .sub_package import module_b
    # или
    from .sub_package.module_b import some_function # импорт конкретной функции
    
    module_b.some_function()
          

    . означает текущий пакет, .. означает родительский пакет и т.д.

  2. Абсолютный импорт (Absolute imports): Использует полное имя пакета для указания модуля.
    # my_package/module_a.py
    import my_package.sub_package.module_b
    
    my_package.sub_package.module_b.some_function()
          

    Этот способ менее гибкий, так как требует знания полного пути до модуля и более громоздкий.

  3. Неявный относительный импорт (Implicit relative imports): Python 2 поддерживал неявные относительные импорты, когда можно было просто указать имя модуля в том же пакете. Этот способ не рекомендуется и не поддерживается в Python 3.
    # my_package/module_a.py (не рекомендуется и не работает в Python 3)
    import sub_package.module_b # избегайте этого
          

Рекомендации:

  • Используйте относительные импорты (from . import ...) внутри пакета для улучшения читаемости и переносимости.
  • Избегайте неявных относительных импортов (они не работают в Python 3).
  • Абсолютные импорты можно использовать, когда нужно импортировать модуль из другого пакета или из стандартной библиотеки.

__init__.py:

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

# my_package/__init__.py
from .module_a import some_function_from_a # экспортируем функцию из module_a

Тогда можно будет использовать:

import my_package
my_package.some_function_from_a()
  
0