В чём разница между пакетами и модулями?

📦 Что такое модуль в Python?

Модуль — это любой файл с расширением .py, который содержит Python-код.
Модуль может содержать:

  • функции,

  • классы,

  • переменные,

  • исполняемый код.

Пример:

\# math_utils.py — это модуль
def add(a, b):
return a + b

Ты можешь подключить этот модуль в другом файле:

import math_utils
print(math_utils.add(2, 3)) # Вывод: 5

📁 Что такое пакет в Python?

Пакет — это папка, которая содержит модули и/или другие пакеты и файл _init_.py.

📌 До Python 3.3 наличие _init_.py обязательно, чтобы Python распознал папку как пакет. Сейчас он необязателен, но часто используется.

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

my_package/  это пакет

├── \__init_\_.py  делает папку пакетом
├── math_utils.py  модуль
├── string_utils.py  модуль
└── subpackage/  вложенный пакет
├── \__init_\_.py
└── helper.py  модуль

Теперь ты можешь использовать:

from my_package import math_utils
from my_package.subpackage import helper

🧠 Главные отличия между модулем и пакетом:

Характеристика Модуль Пакет
Что это Один .py файл Папка с модулями/пакетами и _init_.py
--- --- ---
Назначение Хранит код (функции, классы) Организует структуру проекта
--- --- ---
Подключение import модуль import пакет.модуль
--- --- ---
Пример math_utils.py my_package/
--- --- ---
Может содержать Только код Модули и вложенные пакеты
--- --- ---
Обязательный файл _init_.py
--- --- ---

🔍 Примеры из стандартной библиотеки

  • math — модуль

  • collections — модуль

  • email — пакет (внутри него модули: message, mime, utils и др.)

💬 Аналогия с книгами

  • Модуль — как отдельная глава книги.

  • Пакет — как раздел книги, который содержит главы (модули) и, возможно, подразделы (вложенные пакеты).

🧩 Как _init_.py помогает?

Файл _init_.py запускается при первом импорте пакета. Он может:

  • Выполнять код инициализации,

  • Определять, какие модули экспортировать,

  • Создавать алиасы,

  • Реализовывать "магические импорты".

Пример:

\# my_package/\__init_\_.py
from .math_utils import add
Теперь можно сделать:
from my_package import add

🧪 Как использовать в реальных проектах?

📁 Пример структуры проекта:

project/
├── main.py
├── utils/
 ├── \__init_\_.py
 ├── file_utils.py
 └── db_utils.py

В main.py ты пишешь:

from utils import file_utils
file_utils.read_file('example.txt')