Gestion des modules et des packages
Comprendre les modules et les packages Python
Module vs Package
graph TD
A[Module Python] --> B[Fichier .py unique]
C[Package Python] --> D[Répertoire avec __init__.py]
D --> E[Plusieurs modules]
Hiérarchie des packages
Niveau |
Description |
Exemple |
Module |
Fichier Python unique |
utils.py |
Package |
Répertoire avec des modules |
myproject/ |
Sous-package |
Package imbriqué |
myproject/core/ |
Création d'une structure de package complète
## Créer le répertoire du package
mkdir -p myproject/
cd myproject
## Créer la structure du package
mkdir -p mypackage/core
mkdir -p mypackage/utils
touch mypackage/__init__.py
touch mypackage/core/__init__.py
touch mypackage/utils/__init__.py
Techniques avancées pour init.py
Importations relatives
## mypackage/__init__.py
from.core import main_functionality
from.utils import helper_tools
## Contrôle explicite des importations
__all__ = ['main_functionality', 'helper_tools']
Chargement dynamique de modules
## Découverte dynamique de modules
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
Gestion des dépendances
Gestion des dépendances
## Créer le fichier de dépendances
touch requirements.txt
## Ajouter les dépendances du package
echo "numpy>=1.20.0" >> requirements.txt
echo "pandas==1.3.3" >> requirements.txt
## Installer les dépendances
pip install -r requirements.txt
Distribution de packages
Configuration de l'installation
## 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'
]
)
Packages de noms (Namespace Packages)
## Prise en charge des packages distribués
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
Meilleures pratiques
Pratique |
Description |
Nommage cohérent |
Utiliser des minuscules et des underscores |
init.py minimal |
Garder l'initialisation légère |
Importations claires |
Utiliser des importations explicites |
Suivi des versions |
Maintenir les informations de version |
Conseil LabEx
LabEx recommande de pratiquer les structures de packages dans des environnements de codage pratiques, afin d'aider les développeurs à maîtriser les techniques de gestion des modules et des packages.
Gestion des erreurs lors des importations
## Stratégie d'importation robuste
try:
from.optional_module import OptionalClass
except ImportError:
OptionalClass = None
- Utiliser le chargement différé (lazy loading)
- Minimiser les importations au niveau supérieur
- Implémenter des importations conditionnelles
- Utiliser
__all__
pour les exportations contrôlées