Чем отличается пакет от модуля в Python?

«Чем отличается пакет от модуля в Python?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Простая аналогия: модуль — это файл, пакет — это папка с файлами.

Пример структуры:

my_project/
├── main.py
├── utils.py               # <-- Это модуль
└── my_package/            # <-- Это пакет
    ├── __init__.py        # <-- Инициализирует пакет (может быть пустым)
    ├── core.py            # <-- Модуль внутри пакета
    └── helpers/           # <-- Вложенный пакет
        ├── __init__.py
        └── validator.py

Ключевые отличия:

  1. Организация: Пакет позволяет структурировать код в иерархии, модуль — это плоская единица.
  2. Файл __init__.py: Его наличие (даже пустого) делает директорию пакетом, который Python может импортировать. В Python 3.3+ для пространства имён (namespace package) он может не требоваться, но для обычных пакетов — это стандарт.
  3. Импорт:

    # Импорт модуля
    import utils
    from utils import some_function
    
    # Импорт из пакета
    import my_package.core
    from my_package.helpers import validator
  4. Относительный импорт: Внутри пакета можно использовать относительные импорты (например, from .core import something), что невозможно в одиночном модуле.