← Назад к вопросам

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

1.3 Junior🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между модулем и пакетом в Python

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

Модуль

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

Характеристики:

  • Один файл .py
  • Может содержать функции, классы, переменные
  • Имеет одно имя (имя файла без расширения)
  • Импортируется как: import module_name
# utils.py - это модуль
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

PI = 3.14159

# Импорт модуля
import utils
result = utils.add(5, 3)

# Или импорт конкретной функции
from utils import add
result = add(5, 3)

Пакет

Пакет — это директория, содержащая файл init.py и набор модулей (и/или подпакетов).

Характеристики:

  • Директория с файлом init.py
  • Может содержать модули и подпакеты
  • Позволяет организовать код иерархически
  • Импортируется как: import package_name
# Структура пакета
myproject/
    __init__.py
    utils.py
    math.py
    strings.py

# Импорт из пакета
from myproject import utils
from myproject.utils import add
import myproject.math

Пример: Модуль

# calculator.py - модуль
def multiply(a, b):
    return a * b

def divide(a, b):
    if b == 0:
        raise ValueError("Division by zero")
    return a / b

# Использование
from calculator import multiply, divide
result = multiply(6, 7)  # 42

Пример: Пакет

# Структура
mymath/
    __init__.py
    operations.py
    statistics.py

# mymath/__init__.py
# Может быть пусто или содержать код инициализации пакета
from .operations import add, subtract
from .statistics import mean, median

# mymath/operations.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# mymath/statistics.py
def mean(numbers):
    return sum(numbers) / len(numbers)

def median(numbers):
    sorted_nums = sorted(numbers)
    return sorted_nums[len(sorted_nums) // 2]

# Использование
from mymath import add, mean
result = add(5, 3)  # 8
avg = mean([1, 2, 3, 4, 5])  # 3

Файл init.py

Файл init.py делает директорию пакетом. Может быть пустым или содержать инициализационный код.

# myproject/__init__.py
print("Пакет myproject загружен")
__version__ = "1.0.0"

# Можно переэкспортировать часто используемый код
from .utils import helper_function
from .models import User, Post

__all__ = ['helper_function', 'User', 'Post']

Иерархия пакетов

Пакеты могут содержать подпакеты (вложенные пакеты).

# Структура
project/
    __init__.py
    api/
        __init__.py
        v1/
            __init__.py
            users.py
            posts.py
        v2/
            __init__.py
            users.py
    models/
        __init__.py
        user.py
        post.py

# Импорт из вложенного пакета
from project.api.v1.users import get_user
from project.models.user import User
import project.api.v2.users

Абсолютные и относительные импорты

Абсолютные импорты — из корня проекта:

# в файле project/api/v1/users.py
from project.models.user import User

Относительные импорты — из текущего пакета:

# в файле project/api/v1/users.py
from ...models.user import User  # три уровня вверх
from ..utils import helper  # один уровень вверх
from .handlers import UserHandler  # в текущем пакете

Атрибуты модуля и пакета

import sys
import myproject

# Для модуля
print(sys.modules['myproject'])  # <module 'myproject'...>
print(myproject.__file__)  # путь к __init__.py
print(myproject.__name__)  # 'myproject'
print(myproject.__package__)  # 'myproject'
print(dir(myproject))  # список атрибутов

# __all__ - указывает, что экспортируется с import *
# myproject/__init__.py
__all__ = ['User', 'Post']
from .models import User, Post

# Это импортирует только User и Post
from myproject import *

Сравнительная таблица

КритерийМодульПакет
Что этоФайл .pyДиректория с init.py
СтруктураОдин файлИерархия файлов
Импортimport module_nameimport package_name
СодержимоеФункции, классы, переменныеМодули, подпакеты
Примерutils.pyutils/ (директория)
allОпциональноОпционально
ВложенностьНетДа (подпакеты)

Лучшие практики

Организация пакетов:

myproject/
    __init__.py
    __main__.py  # для python -m myproject
    settings.py
    core/
        __init__.py
        models.py
        services.py
    api/
        __init__.py
        routes.py
        schemas.py
    utils/
        __init__.py
        helpers.py
    tests/
        __init__.py
        test_core.py

Правила именования:

  • Используй snake_case для модулей и пакетов
  • Избегай названий стандартных модулей (sys, os, etc.)
  • Делай имена понятными и конкретными

Экспорт из пакета:

# myproject/__init__.py
from .core.models import User, Post
from .core.services import UserService

__all__ = ['User', 'Post', 'UserService']

# Теперь пользователи могут писать:
from myproject import User, Post
# Вместо:
from myproject.core.models import User, Post

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

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