Code de premier niveau

7.3 Code de premier niveau

Objectifs d'apprentissage

À la fin de cette section, vous devriez être en mesure de :

  • Identifier le code qui s'exécute en tant qu'effet secondaire de l'importation.
  • Expliquer l'utilité de if __name__ == "__main__".

Effets secondaires

Les modules définissent des fonctions et des constantes destinées à être utilisées dans d'autres programmes. Lors de l'importation d'un module, tout le code du module est exécuté de haut en bas. Si un module n'est pas conçu avec soin, du code non désiré peut s'exécuter en tant qu'effet secondaire. Ce code involontaire se trouve généralement au premier niveau, en dehors des définitions de fonctions.

Faites le point

Code de test de la sphère

Concepts en pratique

Effets secondaires

1.
Quelle ligne provoquerait un effet secondaire lors de l'importation ?
1
import math
2
3
print("Defining sphere function")
4
5
def sphere(radius):
6
  """Gets the volume of a sphere."""
7
  return 4/3 * math.pi * radius**3
  1. ligne 1
  2. ligne 3
  3. ligne 5
2.
Le module volume.py suivant provoque un effet secondaire.
import math

def sphere(radius):
  """Gets the volume of a sphere."""
  return 4/3 * math.pi * radius**3

for r in range(10000000):
  volume = sphere(r)
  1. vrai
  2. faux
3.
Le module greeting.py suivant provoque un effet secondaire.
name = input("What is your name? ")
print(f"Nice to meet you, {name}!")
live = input("Where do you live? ")
print(f"{live} is a great place.")
  1. vrai
  2. faux

Utiliser __name__

Les modules Python incluent souvent l'instruction if __name__ == "__main__" pour éviter les effets secondaires. Cette instruction est vraie lorsque le module est exécuté en tant que programme et fausse lorsque le module est importé.

Faites le point

Le module principal

Concepts en pratique

Utiliser __name__

4.
Quelle est la sortie lors de l'exécution du module test.py suivant ?
import math

print(math.__name__)
print(__name__)
  1. >math
    test
    
  2. __main__
    test
    
  3. math
    __main__
    
5.
Quelle est la sortie lors de l'importation du module test.py suivant ?
import math

print(math.__name__)
print(__name__)
  1. math
    test
    
  2. __main__
    test
    
  3. math
    __main__
    
6.
Quelle ligne est utile pour éviter les effets secondaires lors de l'importation ?
  1. if __name__ == "main":
  2. if __name__ == __main__:
  3. if __name__ == "__main__":

Pour aller plus loin

Les variables qui commencent et se terminent par un double tiret bas ont une signification particulière en Python. Ces doubles tirets bas sont familièrement appelés variables « dunder » ou « magiques ». D'autres exemples incluent __doc__ (la docstring du module) et __file__ (le nom de fichier du module).

À vous d'essayer

Effets secondaires

Cet exercice fait suite à l'exercice « Imports manquants ». Précédemment, vous avez ajouté les instructions import manquantes au début du programme. Maintenant, modifiez le programme pour éviter les effets secondaires lors de l'importation du programme en tant que module :

  1. Ajoutez if __name__ == "__main__" à la fin.
  2. Déplacez tout le code de test sous cette instruction if.

Le programme doit s'exécuter sans erreur et produire la même sortie qu'auparavant.

À vous d'essayer

Test de conversion

Cet exercice fait suite à l'exercice « Module de conversion ». Précédemment, vous avez écrit les fonctions cel2fah, fah2cel, km2mi et mi2km. Écrivez du code de test à la fin de conversion.py (le fichier d'origine) pour chacune de ces fonctions. Le code de test ne doit pas s'exécuter en tant qu'effet secondaire lorsque conversion est importé par d'autres programmes. Lors de l'exécution de conversion.py en tant que programme principal, la sortie du test doit être :

    0 C is 32 F
    5 C is 41 F
    10 C is 50 F
    15 C is 59 F
    20 C is 68 F

    20 F is -7 C
    25 F is -4 C
    30 F is -1 C
    35 F is 2 C
    40 F is 4 C
    
    1 km is 0.6 mi
    2 km is 1.2 mi
    3 km is 1.9 mi
    4 km is 2.5 mi
    5 km is 3.1 mi
    
    5 mi is 8.0 km
    6 mi is 9.7 km
    7 mi is 11.3 km
    8 mi is 12.9 km
    9 mi is 14.5 km