Найти в Дзене

Модули и пакеты в Python: полное руководство

Модули и пакеты — это основа организации кода в Python. Они позволяют разбивать программу на логические части, повторно использовать код и структурировать проекты. В этой статье мы разберем ключевые аспекты работы с модулями и пакетами. Модуль — это файл с расширением .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 Пакет — это директория, содержащая модули и файл __init__.py (может быть пустым). Пример структуры: my_package/ __init__.py module1.py module2.py subpackage/ __init__.py module3.py Роль __init__.py: - Указывает Python, что директория является пакетом. - Может содержать код инициализации пакета или список импортов для удобства. Переменная __name__ содержит имя модуля. Если модуль запущен как скрипт, __na
Оглавление

Модули и пакеты — это основа организации кода в 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__ для контроля видимости. Для углубленного изучения обратитесь к официальной документации.