Introduction
Dans ce laboratoire (lab), vous apprendrez à distinguer les modules des packages en Python, ce qui est essentiel pour organiser et gérer efficacement votre code. Le laboratoire vous guide tout au long de la création d'un package nommé my_package contenant un fichier __init__.py et un module nommé my_module.py.
Vous créerez ensuite un script main.py en dehors du package pour importer et utiliser le module, illustrant la différence entre un module (un seul fichier contenant du code Python) et un package (une hiérarchie de répertoires contenant des modules et un fichier __init__.py). Le laboratoire jette les bases pour comprendre comment vérifier si un module est un package en utilisant l'attribut __path__ et la méthode pkgutil.get_loader, qui seront abordés dans les étapes suivantes.
Différencier les modules et les packages
Dans cette étape, vous apprendrez à distinguer les modules des packages en Python. Comprendre cette différence est essentiel pour organiser et gérer efficacement votre code Python.
Modules
Un module est un fichier unique (ou plusieurs fichiers) contenant du code Python, comme des définitions de fonctions, des classes ou des variables. Les modules servent à organiser le code en unités réutilisables.
Packages
Un package est une manière d'organiser des modules liés dans une hiérarchie de répertoires. Un package contient un ou plusieurs fichiers de module et un fichier spécial nommé __init__.py. Le fichier __init__.py peut être vide, mais sa présence indique que le répertoire doit être traité comme un package.
Créons un exemple simple pour illustrer la différence.
Tout d'abord, créez un répertoire nommé
my_packagedans votre répertoire~/project. Ce sera notre répertoire de package.mkdir ~/project/my_packageAccédez au répertoire
my_package:cd ~/project/my_packageCréez un fichier vide nommé
__init__.pyà l'intérieur du répertoiremy_package. Ce fichier indique quemy_packageest un package Python.touch __init__.pyMaintenant, créez un fichier nommé
my_module.pyà l'intérieur du répertoiremy_package. Ce sera notre fichier de module.touch my_module.pyOuvrez
my_module.pydans l'éditeur VS Code et ajoutez le code suivant :## my_module.py def greet(name): return f"Hello, {name}!"Enregistrez le fichier
my_module.py.Maintenant, créons un script Python en dehors du répertoire
my_packagepour utiliser notre module. Revenez au répertoire~/project:cd ~/projectCréez un fichier nommé
main.pydans le répertoire~/project.touch main.pyOuvrez
main.pydans l'éditeur VS Code et ajoutez le code suivant :## main.py import my_package.my_module result = my_package.my_module.greet("LabEx User") print(result)Enregistrez le fichier
main.py.Exécutez le script
main.py:python main.pyVous devriez voir la sortie suivante :
Hello, LabEx User!
Cet exemple montre comment un module (my_module.py) est organisé à l'intérieur d'un package (my_package). Le fichier __init__.py est essentiel pour que Python reconnaisse le répertoire comme un package.
Vérifier l'attribut path
Dans cette étape, vous apprendrez à vérifier l'attribut __path__ dans les packages Python. L'attribut __path__ est un indicateur crucial pour savoir si un répertoire est traité comme un package ou simplement comme un répertoire ordinaire.
L'attribut __path__
Lorsque Python importe un package, il recherche l'attribut __path__. Si cet attribut existe, Python traite le répertoire comme un package et recherche les chemins répertoriés dans __path__ pour trouver les sous - modules et les sous - packages. Si __path__ n'existe pas, Python traite le répertoire comme un répertoire ordinaire.
Continuons avec l'exemple du package my_package de l'étape précédente.
Accédez au répertoire
~/project:cd ~/projectCréez un nouveau fichier Python nommé
check_path.py:touch check_path.pyOuvrez
check_path.pydans l'éditeur VS Code et ajoutez le code suivant :## check_path.py import my_package try: print(my_package.__path__) except AttributeError: print("my_package does not have __path__ attribute") import my_package.my_module try: print(my_package.my_module.__path__) except AttributeError: print("my_package.my_module does not have __path__ attribute")Enregistrez le fichier
check_path.py.Exécutez le script
check_path.py:python check_path.pyVous devriez voir une sortie similaire à celle - ci :
['/home/labex/project/my_package'] my_package.my_module does not have __path__ attributeLa sortie montre que
my_packagea l'attribut__path__, confirmant qu'il est traité comme un package. En revanche,my_package.my_module(qui est un module) n'a pas l'attribut__path__.
Cette distinction est importante pour comprendre comment Python organise et importe le code. Les packages utilisent __path__ pour permettre des sous - modules et des sous - packages imbriqués, tandis que les modules représentent des fichiers de code individuels.
Utiliser pkgutil.get_loader
Dans cette étape, vous apprendrez à utiliser pkgutil.get_loader pour récupérer le chargeur (loader) d'un module ou d'un package. Les chargeurs sont responsables du chargement des modules, et pkgutil.get_loader offre un moyen pratique d'y accéder.
Qu'est-ce qu'un chargeur (Loader)?
Un chargeur est un objet qui sait comment charger un module. C'est une partie de la mécanique d'importation en Python. Il existe différents types de chargeurs pour différents types de modules (par exemple, code source, code compilé ou modules d'extension).
Utilisation de pkgutil.get_loader
La fonction pkgutil.get_loader prend en entrée le nom d'un module ou d'un package et renvoie un objet chargeur s'il en trouve un. Si aucun chargeur n'est trouvé, elle renvoie None.
Continuons avec l'exemple du package my_package des étapes précédentes.
Accédez au répertoire
~/project:cd ~/projectCréez un nouveau fichier Python nommé
get_loader_example.py:touch get_loader_example.pyOuvrez
get_loader_example.pydans l'éditeur VS Code et ajoutez le code suivant :## get_loader_example.py import pkgutil loader = pkgutil.get_loader("my_package.my_module") if loader is not None: print(f"Loader found for my_package.my_module: {loader}") else: print("No loader found for my_package.my_module") loader = pkgutil.get_loader("os") if loader is not None: print(f"Loader found for os: {loader}") else: print("No loader found for os") loader = pkgutil.get_loader("nonexistent_module") if loader is not None: print(f"Loader found for nonexistent_module: {loader}") else: print("No loader found for nonexistent_module")Enregistrez le fichier
get_loader_example.py.Exécutez le script
get_loader_example.py:python get_loader_example.pyVous devriez voir une sortie similaire à celle-ci :
Loader found for my_package.my_module: <_frozen_importlib_external.SourceFileLoader object at 0x...> Loader found for os: <_frozen_importlib_external.SourceFileLoader object at 0x...> No loader found for nonexistent_moduleLa sortie montre qu'un chargeur a été trouvé pour
my_package.my_moduleet le module intégréos, mais aucun chargeur n'a été trouvé pournonexistent_module.
Cet exemple montre comment utiliser pkgutil.get_loader pour vérifier si un module ou un package peut être chargé et pour récupérer son objet chargeur. Cela peut être utile pour l'introspection et le chargement dynamique de modules.
Résumé
Dans ce laboratoire (lab), vous avez appris à différencier les modules et les packages Python. Un module est un fichier unique contenant du code Python, tandis qu'un package est une hiérarchie de répertoires contenant des modules et un fichier __init__.py, qui indique que le répertoire est un package.
Vous avez créé un package nommé my_package avec un fichier __init__.py et un module nommé my_module.py contenant une fonction greet. Vous avez ensuite créé un script main.py en dehors du package pour importer et utiliser la fonction greet du module my_module dans le package my_package.



