Modules et importations

Dans cette page, nous allons répondre aux questions suivantes :

  • comment utiliser une même fonction dans plusieurs programmes différents ?
  • comment avoir la définition d’une fonction dans un fichier différent de celui qui contient le programme principal ?

Très souvent, c’est une personne qui définit une fonction et une autre qui l’utilise. Par exemple, avec la bibliothèque matplotlib, on peut utiliser la fonction plot() pour tracer des courbes sans avoir à écrire nous-mêmes cette fonction. Nous allons donc voir à présent comment définir des fonctions dans un module et faire en sorte qu’un utilisateur puisse appeler ces fonctions dans son programme.

Par exemple, nous allons créer un fichier nommé puissance.py qui va définir 2 fonctions : carre() et cube(). Un tel fichier est appelé un module et il va pouvoir être importé dans un autre fichier, et en particulier dans le fichier qui contient le programme principal.

def carre(valeur):
    resultat = valeur**2
    return resultat

def cube(valeur):
    resultat = valeur**3
    return resultat

Il est maintenant possible d’utiliser dans un programme principal les fonctions qui ont été définies dans le module puissance.py. Pour cela, il faut importer les fonctions à partir du module.

Exemple : on importe une seule fonction

from puissance import carre

a = 5
u = carre(a)
print("le carre vaut", u)

Warning

Le fichier puissance.py doit être dans le même répertoire que le programme principal (ou bien se trouver dans le “path” de Python).

Exemple : on importe explicitement les deux fonctions

from puissance import carre, cube

a = 5
u = carre(a)
print("le carre vaut", u)
v = cube(a)
print("le cube vaut", v)

Exemple : on importe toutes les fonctions

from puissance import *

a = 5
u = carre(a)
print("le carre vaut", u)
v = cube(a)
print("le cube vaut", v)

Warning

L’importation de toutes les fonctions avec * est fortement déconseillée. En effet, elle ne permet pas d’avoir une vision claire des fonctions qui ont été importées. Ceci est donc une source potentielle d’erreurs.

Exemple : on importe le module

import puissance

a = 5
u = puissance.carre(a)
print("le carre vaut", u)
v = puissance.cube(a)
print("le cube vaut", v)

Note

Dans ce cas, il faut préciser le nom du module devant la fonction.

Exemple : on importe le module et on lui donne un alias

import puissance as pu
a = 5
u = pu.carre(a)
print("le carre vaut", u)
v = pu.cube(a)
print("le cube vaut", v)

Exemple : on importe une fonction d’un module et on lui donne un alias

Il est aussi possible de donner un alias à une fonction comme dans l’exemple suivant :

from puissance import carre as ca

a = 5
u = ca(a)
print("le carre vaut", u)

Package

Quand on a un grand nombre de modules, il peut être intéressant de les organiser dans des dossiers. Un dossier qui rassemble des modules est appelé un package (paquetage en français). Le nom du package est le même que celui du dossier. Par exemple, on crée un dossier package1 dans lequel on place le fichier module1.py suivant :

def fonction1(a):
    return a**2

On peut ensuite utiliser la fonction fonction1() définie dans module1.py, en important package1.module1 comme dans l’exemple qui suit :

import package1.module1

u = package1.module1.fonction1(3)
print("u vaut", u)

Note

Il est aussi possible d’avoir des dossiers imbriqués, c’est-à-dire des dossiers qui contiennent d’autres dossiers.

Complément

Dans la documentation de Python, il est fait une distinction entre script et module. Voici quelques précisions sur cette distinction.

En Python, lorsqu’on crée un fichier qui rassemble des instructions au lieu de les taper une à une dans l’interpréteur, on appelle ce fichier un script et on le sauvegarde avec une extension .py, par exemple essai.py.

Quand on est amené à travailler sur un programme long, il est utile de séparer le programme en plusieurs fichiers. Certaines parties peuvent alors être réutilisées par d’autres programmes.

Il est par exemple possible d’effectuer la définition des fonctions dans un fichier séparé pour ensuite les utiliser dans un script ou dans l’interpréteur. Le fichier qui contient ces définitions a aussi une extension .py, mais on appelle ce fichier un module.

Les modalités pour importer un module sont expliquées plus haut dans cette page.

A l’intérieur d’un module, le nom du module (en tant que chaîne de caractères) peut être obtenu grâce à la variable globale __name__. Par exemple, si on utilise le module puissance.py défini précédemment, on a dans l’interpréteur :

>>> import puissance
>>> puissance.__name__
'puissance'

Un même fichier .py peut jouer le rôle de script ou de module suivant son utilisation.

Exécution d’un module en tant que script

Quand on utilise un fichier en tant que script, la variable globale __name__ prend pour valeur '__main__'. Ceci permet d’avoir dans le fichier un bloc d’instructions qui sera exécuté uniquement lorsque le fichier est lancé en tant que script.

Par exemple, pour le fichier puissance2.py suivant :

def carre(valeur):
    resultat = valeur**2
    return resultat

if __name__ == "__main__":
    a = 3
    print("le carre vaut", carre(a))

On peut lancer une exécution directe en tant que script et on obtient alors :

le carre vaut 9

Ou bien on peut importer puissance2 en tant que module, par exemple dans le fichier suivant :

import puissance2 as pu2

b = 4
print("le carre vaut", pu2.carre(b))

Si on exécute ce script, on obtient :

le carre vaut 16

Pour plus de détails, voir : https://docs.python.org/3/tutorial/modules.html.