Les modules Python pour organiser votre code

Les modules Python sont des fichiers qui contiennent des fonctions, des classes et des variables que l’on peut utiliser dans nos programmes.

L’objectif d’un module Python est de décomposer les grands programmes en petits fichiers gérables et organisés. De plus, les modules permettent de réutiliser un code à chaque fois que vous en aurez besoin.

Modules python

La plupart des fonctions natives de Python ne sont pas intégrées au cœur du langage, mais sont fournies via des modules spécifiques, que vous pouvez utiliser selon vos besoins.

Supposons que nous voulions créer un programme pour une calculatrice. Nous aurons des opérations comme l’addition, la soustraction, la multiplication, la division, etc.

En fait, nous allons créer un fichier qui contiendra les fonctions dont nous aurons besoin. Afin d’utiliser un module, nous commencerons par l’importer, puis utiliser la fonction qui nous intéresse.

La structuration d’un programme Python

L’architecture d’un programme Python est basée sur les modules. En effet, dans des programmes volumineux, on utilise un module comme fichier principal ou de niveau supérieur. Par conséquent, c’est ce fichier qui sera responsable du démarrage du programme.

Comme l’importation des modules exécutent le code dans un fichier en cours de chargement, elle est considérée comme une façon de lancer le programme.

Par défaut, l’importation d’un module Python se fait une seule fois par session dans la console. Les importations ultérieures ne font rien, même si nous modifions et sauvegardons à nouveau le fichier source du module dans une autre fenêtre.

Lorsqu’un fichier Python de niveau supérieur (principal) est exécuté, ses instructions et les instructions dans les modules importés sont compilées dans un format intermédiaire appelé bytecode, qui est un format indépendant. Les fichiers de bytecode des modules importés sont stockés dans le répertoire __pycache__.

Comment créer des modules Python ?

Créez un fichier module_math.py. Enregistrez-le dans le répertoire où se trouve votre exécutable Python. Comme pour les fonctions, vous avez la possibilité de créer une docstring au début de votre module.

Notre module contiendra quatre fonctions.

# module_math.py
"""
Votre premier module module_math.py,
contenant des fonctions mathématiques
"""
def add(x,y):
     """La somme de deux nombres"""
     return x + y
 
def sous(x, y):
     """La soustraction de deux nombres"""
     return x - y
 
def mult(x, y):
     """La multiplication de deux nombres"""
     return x * y
 
def div(x, y):
     """La division de deux nombres"""
     return x / y

Créez un autre fichier test.py. Nous utiliserons le mot-clé import pour récupérer du code à partir de notre module.

1- Utiliser import module

# test.py
import module_math
x = 3
y = 2
 
addition = module_math.add(x,y)
print(addition)

Nous avons utilisé module_math.add() pour appeler la fonction add(), le point indique que la fonction add() appartient au module module_math. En fait, nous définissons quelle fonction nous voulons utiliser. Exécutez le code du fichier text.py :

5

2- Utiliser from module import *

Nous pouvons importer toutes les fonctions qui existent dans un module.

# test.py
from module_math import *
x = 3
y = 2
 
addition = add(x,y)
print(addition)

Contrairement à la méthode précédente, nous avons importé toutes les fonctions en utilisant l’astérisque.
Par conséquent, tout ce que nous aurons à faire est de simplement indiquer le nom de la fonction que nous voulons utiliser.
Cependant, si vous importez plusieurs modules, vous ne pourrez pas utiliser les fonctions qui ont le même nom. Cette méthode est déconseillée, avec plusieurs fonctions, vous allez certainement vous perdre.

3- Utiliser from module import votre_fonction

Lorsque vous souhaitez importer uniquement des éléments spécifiques, vous pouvez utiliser le mot-clé from pour importer ce que vous voulez.

from module_math import add
x = 3
y = 2
 
addition = add(x,y)
print(addition)

La fonction sera accessible directement sans ajouter le nom du module dans l’appel de la fonction.

Il est également possible d’utiliser cette méthode pour importer des fonctions spécifiques.

from module_math import add, mult

4- Utiliser un alias

Il est possible d’importer un module Python en utilisant un alias.

import module_math as mm

Donc, mm.add() remplacera module_math.add().

Ou encore :

>>> from module_math import add as a
>>> a(4,3)
7

Modification du code dans un module :
Enregistrez vos modifications, puis exécutez le code du fichier qui importe le module. De plus, vous pouvez redémarrer le shell si vous exécutez le code en mode interactif en accédant à :
Shell -> Restart Shell

Astuce :
Sachez également que vous pouvez utiliser l’auto-complétion dans votre console, en écrivant une ou deux lettres, puis en appuyant sur la touche Tab.

À présent, utilisons la fonction help() pour récupérer quelques informations.
Dans la console, tapez :

>>> import module_math
>>> help(module_math)

Les modules Python intégrés

En plus des fonctions intégrées, plusieurs fonctions prédéfinies sont également disponibles dans des bibliothèques fournies avec les distributions Python. En effet, une bibliothèque englobe plusieurs modules prêts à être utilisés.

Vous pouvez consulter tous les modules Python disponibles.
Tapez cette commande dans la console :

>>> help('modules')

Les modules Python intégrés se comportent comme des modules ordinaires, mais leur code source Python n’est pas disponible, car ils ne sont pas écrits en Python mais écrits en C.

Prenons l’exemple de sys , une bibliothèque standard Python qui fournit des fonctions pour interagir avec l’interpréteur lui-même. Python est livré avec de nombreuses bibliothèques qui effectuent différentes tâches.

Le chemin de recherche du module

L’emplacement exact où Python recherche les modules est défini dans une variable appelée path, à laquelle vous pouvez accéder via un module appelé sys. Saisissez ce qui suit dans la console :

>>> import sys
>>> sys.path

La valeur affichée sous ubuntu est :

['', '/home/user', '/usr/local/bin',
'/usr/local/lib/python38.zip', '/usr/local/lib/python3.8',
'/usr/local/lib/python3.8/lib-dynload',
'/usr/local/lib/python3.8/site-packages']

Sous Windows, la sortie ressemblera à ceci :

['', 'C:\\Users\\utilisateur\\Documents\\Python\\doc', 
'C:\\Python38\\Lib\\idlelib', 'C:\\Python38\\python38.zip',
'C:\\Python38\\DLLs', 'C:\\Python38\\lib',
'C:\\Python38', 'C:\\Python38\\lib\\site-packages']

Cette affichage dépend de la configuration de votre système. Sans entrer dans les détails, vous avez une liste des répertoires dans lesquels Python recherche (dans l’ordre) lorsqu’il exécute une instruction d’importation.

Le premier module trouvé qui satisfait la demande d’importation est utilisé. Si le module n’existe pas, une erreur ImportError sera affiché.

Dans votre IDLE, vous pouvez vérifier le chemin de recherche et les modules qu’il contient à l’aide de la fenêtre Path Browser, à partir du menu File dans le shell Python.

Lors de l’importation d’un module, l’interpréteur Python recherche le module dans les emplacements suivants :
– Le répertoire du script exécuté, ou le répertoire actuel si le code est exécuté en mode interactif.
– Si le module n’est pas trouvé, Python recherche dans la variable d’environnement PYTHONPATH.
– Si tout le reste échoue, Python vérifie le chemin par défaut selon votre système d’exploitation. Sous UNIX, ce chemin par défaut est normalement /usr/local/lib/python/.

Afficher le contenu d’un module avec la fonction dir ()


Pour afficher les méthodes et les attributs d’un module après son importation, vous pouvez utiliser la fonction intégrée dir() avec le nom du module comme argument.

>>> dir(module_math)
['__builtins__', '__cached__', '__doc__', '__file__',
 '__loader__', '__name__', '__package__', '__spec__',
 'add', 'div', 'mult', 'sous']

Les fonctions que nous avons définis sont affichés à la fin de la liste.

Ces attributs peuvent nous fournir certaines information sur le module.

Afficher le nom du module.

>>> module_math.__name__
'module_math'

Afficher l’emplacement du module.

>>> module_math.__file__
'/home/user/module_math.py'

Sachez que le module_math est le module principal ou main en anglais et qui sera exécuté en premier.

>>> print(__name__)
__main__

La variable __name__

Créez un fichier bonjour.py

# bonjour.py
print("Bonjour, je suis bonjour.py, le module " + __name__)

Appuyez sur F5 pour exécuter le code dans le shell.

Bonjour, je suis bonjour.py, le module __main__

Créez un autre fichier test.py.

# test.py
print ( "je suis test.py, le module " + __name__)

Appuyez sur F5.

je suis test.py, le module __main__

Donc, lorsqu’un module est exécuté seul, il est défini par l’interpréteur Python sur __main__ou principal.

Nous allons importer le module bonjour.py dans test.py.

# test.py
import bonjour

print ( "je suis test.py, le module " + __name__)

Exécutez le code de test.py.

Bonjour, je suis bonjour.py, le module bonjour
je suis test.py, le module __main__

Python à affiché le nom du module importé bonjour.py, donc il n’est plus main. En fait, c’est la valeur de la variable spéciale __name__ qui a changé.

L’instruction __name__ = "main"

Dans un projet réel, notre module devrait contenir des fonctions.
Supposons que vous avez un message de bienvenue, qui devrait être affiché lorsque les utilisateurs accèdent à votre programme.
Dans le module bonjour.py, créez une fonction bienvenue().

# bonjour.py
def bienvenue():
    print("Bonjour !")
    print("Vous allez apprendre Python.")

bienvenue()  

Exécutez le code du fichier test.py.

# test.py
import bonjour

print ("Un package contient plusieurs modules.")

Le résultat sera :

Bonjour !
Vous allez apprendre Python.
Un package contient plusieurs modules.

Par ailleurs, si l’utilisateur était déjà là, vous n’allez pas lui souhaitez la bienvenue à chaque fois.
Python vous permet d’utiliser une instruction magique qui exécutera le module uniquement quand il est utilisé comme module principal.

# bonjour.py
def bienvenue():
    print("Bonjour !")
    print("Vous allez apprendre Python.")

if __name__ == "__main__":
    bienvenue()   

N’oubliez pas que __name__ et le nom de la variable et "__main__" est la valeur, qui est une chaîne de caractères.
Exécutez test.py.

Un package contient plusieurs modules.

Le message de bienvenue à disparu. Pour l’afficher, vous devrez lancer le module bonjour.py comme module principal.

De plus, ce concept vous permet d’utiliser un fichier comme script et l’importer comme module en cas de besoin.

Les modules Python et les espaces de noms

Un espace de noms en Python sert à lier chaque nom que vous définissez à l’objet qui lui correspond. Pour faire simple chaque nom est associé à un objet sous la forme de nom : objet ou clé = valeur.

Ainsi, une instruction comme x = 1 ajoute x à un espace de nom et l’associe à la valeur 1.
Par exemple, Python identifie et regroupe les objets dans l’espace de nom du module module_math pour les isoler du reste du code. Cette notion aide l’interpréteur à garder une trace des variables et des objets afin de les lier à un espace de nom précis. En fait, ce concept permet d’éviter les conflits entre les objets portant le même nom.
L’espace de nom module_math, contient les fonction add(), sous(), mult() et div(). Un autre module peut abriter des fonctions avec ces mêmes noms et aucun conflit ne sera enregistré.

La bibliothèque standard Python

Une bibliothèque en Python désigne un code réutilisable que vous pouvez inclure dans vos programmes. En effet, la bibliothèque standard Python fournis des dizaines de modules et font partie de chaque installation Python. Par conséquent, ces modules vous évitent d’écrire un code qui existe déjà.

Le module sys

Le module sys fournit des fonctions et des variables utilisées pour manipuler l’environnement d’exécution de Python. Nous avons déjà vu que la sys.path sert à lister le chemin de recherche d’un module.
Supposons que nous voulions vérifier la version de Python.

>>> sys.version
'3.8.5 (default, Jul 28 2020, 01:26:43) \n[GCC 7.5.0]'

Le module OS

Le module OS fournit des fonctions qui permettent d’interagir avec le système d’exploitation.

os.getcwd (), renvoie le répertoire actuel (current working directory)

>>> import os
>>> os.getcwd()
'/home/user'

Le module math

Ce module contient les fonctions mathématiques les plus courantes.
La méthode pow() prend deux arguments, élève le premier nombre à la puissance du second et renvoie le résultat.

>>> math.pow(10,2)
100.0

Le module random

Le module random peut effectuer plusieurs tâches différentes, vous pouvez l’utiliser pour générer des données aléatoires. L’utilisation la plus basique est de générer des entiers aléatoires.


# Générer un nombre aléatoire entre 0 et 20
import random
>>> random.randint(0,20)
19
>>> random.randint(0,20)
1

Le module datetime

Pour récupérer à la fois la date et l’heure actuelles, on utilise la fonction datetime.now()du module datetime.

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2020, 9, 26, 17, 22, 27, 602664)

Vous avez même les millisecondes.

Les packages

Un package Python est un répertoire qui contient plusieurs modules. Pour qu’un interpréteur Python le traite comme un package, votre répertoire doit abriter un fichier __init.py__. En fait, vous n’avez rien à mettre dans ce fichier.
Un package est simplement un espace de noms, qui peut également contenir des sous-packages.

Au fur et à mesure que notre programme grandit, avec de nombreux modules, nous regroupons les modules similaires dans un seul package. Par conséquent, le projet sera mieux structuré et plus facile à gérer.

Importer un module depuis un package

On applique ici le même principe que celui d’importer une fonction à partir d’un module.

import package.sous-package.module.notre_fonction()

Nous pouvons également importer le module sans le préfixe du package.

from package.sous-package import module

Puis nous allons appeler la fonction.

module.notre_fonction()

Ou encore, importer uniquement la fonction.

from package.sous-package.module import notre_fonction()

Ce qui nous permet d’appeler la fonction directement.
En fait, cette méthode n’est pas recommandée. L’utilisation de l’espace de nom complet évite la confusion et les conflits.

On écrit une docstring d’un package Python dans le fichier __init__.py.

Les packages Python externes

L’un des éléments qui fait de Python un langage si apprécié des développeurs est le nombre important de packages mis à notre disposition. En plus de la bibliothèque standard de Python, il existe des bibliothèques externes qui nous facilitent la vie.

L’index des packages Python (PyPI) est un référentiel qui stocke tous les packages fournis par la communauté des développeurs Python.

En fait, on peut installer un package à l’aide du programme d’installation de package pip, qui est installé avec Python. Il vous permet de rechercher, installer, télécharger et supprimer des packages dans PyPI et d’autres index de packages Python.

La commande utilisée pour installer n’importe quel package Python externe est :
pip install nom_du_package.

Les modules Python pour organiser votre code

Un commentaire sur « Les modules Python pour organiser votre code »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Retour en haut