Exécution d'un fichier python☘
Lorsqu'on lance un fichier Python, il se passe un certain nombre de choses plus ou moins complexes. Ici nous allons simplement insister sur la distinction entre "Python lit une définition de fonction" et "Python exécute une fonction" via quelques exemples.
Exemple 1☘
Prenons le code ci-dessous enregistré dans un fichier python, dans lequel les fonctions définies sont des fonctions qui se contentent d'afficher un résultat.
1 2 3 4 5 6 7 8 9 10 |
|
On lance l'exécution de ce fichier. Quel affichage obtient-on ?
Ce que l'on obtient
On obtient:
Exécution de la partie "principale"
En particulier, on n'obtient pas les messages Exécution de f
ou Exécution de g
alors que les print correspondants semblent être placés
avant dans le texte.
Pourquoi?
Pourquoi n'obtient-on pas Exécution de f
ou Exécution de g
?
Parce qu'on ne l'a pas demandé!
Il faut bien comprendre ce qu'il passe lorsqu'on demande d'exécuter le fichier. Un descriptif simplifié:
Ce fichier est lu dans l'ordre du texte.
-
Lorsque le code des lignes 1,2 est lu,
c'est la définition de cette fonction qui est ainsi lue. Cette définition est stockée en mémoire, cette mémoire est étiquetée1 2
def f(): print("Exécution de f")
f
. Mais le corps de la fonction n'est pas exécuté à ce moment là, l'action faite est uniquement d'enregistrer la définition de la fonction. -
Il en va de même lorsque le code des lignes 6,7 est lu.
6 7
def g(): print("Exécution de g")
-
Puis on lit le code de la ligne 10
Ce code est en-dehors de la définition d'une fonction: il est donc, lui, exécuté.10
print("Exécution de la partie \"principale\" ")
Affichages de f et g
Pour obtenir les affichages de f et g, il faut faire un appel à ces fonctions.
Par exemple (lignes 11 et 12):
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Exemple 2☘
Un fichier python contient le code suivant:
print("Valeur de a: ", a)
a = 2
Qu'obtiendra-t-on à l'exécution de ce fichier ?
Solution
On obtient une erreur.
NameError: name 'a' is not defined
Pourquoi ?
Lorsque la ligne print("Valeur de a: ", a)
est lue, cette ligne n'étant
pas dans le corps de définition d'une fonction, elle est exécutée. Mais
à ce moment là, la variable a
n'a pas encore été définie. Il y a donc
tentative d'affichage d'une valeur non définie.
Exemple 3☘
Code 1☘
Avec le code suivant:
1 2 3 4 5 6 7 |
|
l'instruction print("Valeur de a: ", a)
semble également être écrite
avant que l'on définisse a
. Aura-t-on le même problème que dans l'exercice
précédent ?
Solution
Non, on obtient:
Valeur de a: 2
Pourquoi?
Lorsque le fichier est lu:
-
la définition de f (lignes 1,2) est d'abord lue, mais rien n'est exécuté. On se contente de mettre l'étiquette f sur un ordre du type
print...
-
Ensuite
a=2
(ligne 6) est lu et exécuté. Il y a donc bien à ce stade une variable nomméea
. -
Enfin
f
est exécutée (appel de la ligne 7): l'intructionprint ...
est exécutée et à ce stade ne pose pas de problème cara
est bien connu.
Code 2☘
Et avec le code suivant, qu'obtient-on ?
1 2 3 4 5 6 |
|
Solution
A nouveau une erreur.
Pourquoi?
Lorsque le fichier est lu:
-
la définition de f (lignes 1,2) est d'abord lue, mais rien n'est exécuté. On se contente de mettre l'étiquette f sur un ordre du type
print...
-
Ensuite, avec l'instruction
f()
(ligne 5), on exécute f... or à ce stade, la ligne définissanta
n'a pas encore été lue. L'instructionprint...
que l'on cherche à exécuter va donc provoquer une erreur.
Exemple 4☘
Et avec le code suivant, quels affichages obtient-on ?
1 2 3 4 5 6 7 8 9 10 |
|
Solution
On obtient:
Exécution de f.
Exécution de g.
Pourquoi?
Il faut comprendre pourquoi il n'y a pas d'erreur alors que l'appel à la fonction g
est écrit avant que g
ne soit définie.
Là encore, il ne faut pas confondre la définition et l'exécution.
-
Python lit le texte définissant
f
(lignes 1 à 3):A ce stage, le code n'est pas exécuté.def f(): print("Exécution de f.") g()
-
Puis Python lit le texte définissant
g
(lignes 5 à 6):Il n'y a toujours pas d'exécution d'instruction à ce stade.def g(): print("Exécution de g.")
-
Enfin, Python lit le code lui demandant d'exécuter
f
(ligne 10) dans la "partie principale". A ce stade, il va donc bien chercher à exécuterg
(instruction ligne 3 dans le code définissant f) ... mais à ce moment là, la définition deg
a bien été déjà lue: il n'y a donc pas de problème.