Модули и пакеты в Python: полное руководство
Модули и пакеты в Python: полное руководство
Модули и пакеты — это основа организации кода в Python. Они позволяют разбивать программу на логические части, повторно использовать код и структурировать проекты. В этой статье мы разберем ключевые аспекты работы с модулями и пакетами.
1. Модули и их импорт
Модуль — это файл с расширением .py, содержащий функции, классы и переменные.
Пример: файл math_utils.py:
def add(a, b):
return a + b
def multiply(a, b):
return a * b
Импорт модуля:
import math_utils
print(math_utils.add(2, 3)) # 5
# Импорт отдельных функций
from math_utils import multiply
print(multiply(2, 3)) # 6
2. Пакеты и __init__.py
Пакет — это директория, содержащая модули и файл __init__.py (может быть пустым).
Пример структуры:
my_package/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py
Роль __init__.py:
- Указывает Python, что директория является пакетом.
- Может содержать код инициализации пакета или список импортов для удобства.
3. __name__ и __main__
Переменная __name__ содержит имя модуля. Если модуль запущен как скрипт, __name__ становится "__main__". Это позволяет отделить код выполнения от логики модуля.
Пример (script.py):
if __name__ == "__main__":
print("Запуск как скрипт")
else:
print("Импорт модуля")
4. Дополнительные атрибуты модулей
__doc__: Строка документации модуля.__file__: Путь к файлу модуля.__package__: Имя пакета, к которому относится модуль.
Пример:
import math_utils
print(math_utils.__file__) # Путь к math_utils.py
5. Абсолютный и относительный импорт
- Абсолютный импорт указывает полный путь от корня проекта:
from my_package.module1 import some_function - Относительный импорт (внутри пакета) использует точки:
from .subpackage.module3 import some_class
6. Изменение пути поиска модулей
Python ищет модули в путях из списка sys.path. Его можно модифицировать:
import sys
sys.path.append("/custom/path")
7. Импорт * из пакета и __all__
Чтобы контролировать, что импортируется при from package import *, используйте список __all__ в __init__.py или модуле:
# В __init__.py
__all__ = ["module1", "module2"]
8. Запуск модуля как скрипта
Модуль можно запустить через python -m module_name, если он содержит блок:
if __name__ == "__main__":
main()
9. Кэш модулей: sys.modules
Python кэширует загруженные модули в sys.modules. Повторный импорт использует кэш. Просмотр:
import sys
print(sys.modules.keys())
10. Перезагрузка модулей: importlib.reload()
Для обновления кода без перезапуска интерпретатора:
import importlib
importlib.reload(module_name)
Важно: Может вызвать проблемы с состоянием объектов!
11. Finders и Loaders
- Finders ищут модули (через
sys.meta_path). - Loaders загружают их.
Эти механизмы можно кастомизировать для поддержки нестандартных источников (например, загрузки из ZIP-архивов).
12. Импортные хуки
Позволяют перехватывать процесс импорта для реализации своей логики (например, загрузка модулей из базы данных). Пример использования sys.path_hooks.
Заключение
Понимание модулей и пакетов критически важно для создания масштабируемых приложений на Python. Используйте абсолютные импорты для четкости, __init__.py для инициализации пакетов и __all__ для контроля видимости. Для углубленного изучения обратитесь к официальной документации.