Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между модулем и пакетом в 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_name | import package_name |
| Содержимое | Функции, классы, переменные | Модули, подпакеты |
| Пример | utils.py | utils/ (директория) |
| 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
Вывод: модуль — это один файл, пакет — это директория с модулями. Пакеты позволяют создавать иерархическую структуру проекта и лучше организовать большие приложения.