В чем различие между модулем и пакетом в Python?

Ответ

В Python модуль — это отдельный файл с расширением .py, который содержит исполняемый код: функции, классы, переменные и другие инструкции. Модули позволяют логически группировать связанный код и повторно использовать его в разных частях программы.

Пример модуля:

# my_module.py
def greet(name):
    return f"Hello, {name}!"

class MyClass:
    pass

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

Структура пакета:

my_package/
├── __init__.py  # Обязательный файл для Python 2, опциональный для Python 3.3+ (но рекомендуется)
├── module1.py
└── subpackage/
    ├── __init__.py
    └── module2.py

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

  • Модуль: Один файл .py. Представляет собой единицу кода.
  • Пакет: Директория, содержащая модули (и, возможно, подпакеты) и файл __init__.py. Представляет собой способ организации множества модулей.
  • Назначение: Модули группируют связанный код; пакеты группируют связанные модули и подпакеты, создавая пространство имен.
  • Иерархия: Модули не имеют внутренней иерархии (кроме того, что они находятся в файловой системе); пакеты поддерживают вложенность (подпакеты).

Примеры импорта:

# Импорт модуля
import my_module
print(my_module.greet("World"))

# Импорт модуля из пакета
from my_package import module1
# Или: import my_package.module1
# Или: from my_package.subpackage.module2 import some_function

Ответ 18+ 🔞

А, ну вот, смотри, опять про эти ваши модули и пакеты. Ну ладно, раз уж спросили, сейчас разложу по полочкам, чтобы даже самый упоротый джуниор понял, без этой вашей академической пиздобольщины.

Представь себе, что модуль — это просто один файлик с кодом, .py на конце. Ну, типа, одинокий воин в файловой системе. В нём можно накидать функций, классов, переменных — всё, что душе угодно. Создал, сохранил, и всё, он уже модуль. Проще пареной репы.

Вот, смотри, пример такого одиночки:

# my_module.py
def greet(name):
    return f"Hello, {name}!"

class MyClass:
    pass

А теперь, внимание, ёпта! Если этих файликов-модулей становится овердохуища, и они все в одной куче валяются — это же пиздец, а не проект. Тут-то и появляется пакет. Это не файл, а целая папка, директория, понимаешь? Но не простая папка, а с изюминкой.

Чтобы Python не принял её за случайную кучу мусора, внутри должен лежать файлик __init__.py. Он может быть пустым, может что-то делать — не суть. Главное, его наличие (ну, в старых версиях Питона точно) — это как печать: «Здесь живёт пакет, блядь!».

Вот как эта хитрая жопа выглядит:

my_package/
├── __init__.py  # Файл-признак пакета. Без него — просто папка с файлами, нахуй.
├── module1.py
└── subpackage/
    ├── __init__.py
    └── module2.py

Видишь? Внутри пакета могут быть другие модули и даже подпакеты — это когда одна папка сидит в другой, как матрёшка, ебать её в сраку. Получается целая иерархия, чтоб всё по полочкам.

Короче, резюмирую, чтобы запомнил:

  • Модуль — один файл .py. Как солдат-одиночка.
  • Пакет — папка с модулями (и другими папками-пакетами) и волшебным файлом __init__.py. Как целая армия с подразделениями.
  • Зачем это всё? Модули — чтобы код не в одну кучу. Пакеты — чтобы модули не в одну кучу. Чтоб не было бардака, в рот меня чих-пых!

Ну и как этим пользоваться, спрашиваешь? Да элементарно:

# Берём модуль целиком
import my_module
print(my_module.greet("World"))  # "Hello, World!"

# Тащим модуль из нашего пакета
from my_package import module1
# Или вот так: import my_package.module1
# А можно из глубины подпакета вытащить одну конкретную функцию:
# from my_package.subpackage.module2 import some_function

Вот и вся магия. Не такой уж и ёперный театр, правда? Главное — не запутаться в этих папках, а то можно так заимпортить, что сам от себя охуеешь.