Управление модулями и пакетами
Понимание модулей и пакетов Python
Модуль против пакета
graph TD
A[Python Module] --> B[Single .py File]
C[Python Package] --> D[Directory with __init__.py]
D --> E[Multiple Modules]
Иерархия пакетов
| Уровень |
Описание |
Пример |
| Модуль |
Один файл Python |
utils.py |
| Пакет |
Каталог с модулями |
myproject/ |
| Подпакет |
Вложенный пакет |
myproject/core/ |
Создание комплексной структуры пакета
## Create package directory
mkdir -p myproject/
cd myproject
## Create package structure
mkdir -p mypackage/core
mkdir -p mypackage/utils
touch mypackage/__init__.py
touch mypackage/core/__init__.py
touch mypackage/utils/__init__.py
Продвинутые техники работы с init.py
Относительные импорты
## mypackage/__init__.py
from .core import main_functionality
from .utils import helper_tools
## Explicit import control
__all__ = ['main_functionality', 'helper_tools']
Динамическая загрузка модулей
## Dynamic module discovery
import os
import importlib
def load_modules(package_path):
modules = {}
for filename in os.listdir(package_path):
if filename.endswith('.py') and not filename.startswith('__'):
module_name = filename[:-3]
modules[module_name] = importlib.import_module(f'.{module_name}', package=__name__)
return modules
Управление зависимостями
Управление требованиями
## Create requirements file
touch requirements.txt
## Add package dependencies
echo "numpy>=1.20.0" >> requirements.txt
echo "pandas==1.3.3" >> requirements.txt
## Install dependencies
pip install -r requirements.txt
Распространение пакетов
Конфигурация setup
## setup.py
from setuptools import setup, find_packages
setup(
name='mypackage',
version='0.1.0',
packages=find_packages(),
install_requires=[
'numpy>=1.20.0',
'pandas==1.3.3'
]
)
Пространства имен пакетов (Namespace Packages)
## Support for distributed packages
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
Лучшие практики
| Практика |
Описание |
| Согласованное именование |
Используйте строчные буквы и подчеркивания |
| Минимальный init.py |
Сделайте инициализацию легковесной |
| Явные импорты |
Используйте явные импорты |
| Отслеживание версий |
Сохраняйте информацию о версии |
Информация от LabEx
LabEx позволяет практиковать работу со структурами пакетов в интерактивных средах программирования, помогая разработчикам овладеть техниками управления модулями и пакетами.
Обработка ошибок при импорте
## Robust import strategy
try:
from .optional_module import OptionalClass
except ImportError:
OptionalClass = None
Оптимизация
- Отложенная загрузка (lazy loading)
- Минимизация импортов на верхнем уровне
- Реализация условных импортов
- Использование
__all__ для контролируемого экспорта