Importer des noms

7.2 Importer des noms

Objectifs d'apprentissage

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

  • Importer des fonctions depuis un module à l'aide du mot-clé from.
  • Expliquer comment éviter une collision de noms lors de l'importation d'un module.

Le mot-clé from

Des fonctions spécifiques d'un module peuvent être importées à l'aide du mot-clé from :

    from area import triangle, cylinder

Ces fonctions peuvent être appelées directement, sans faire référence au module :

    print(triangle(1, 2))
    print(cylinder(3, 4))

Pour aller plus loin

Comme illustré ci-dessous, le mot-clé from peut conduire à des noms ambigus.

Faites le point

Importer des fonctions

Concepts en pratique

Le mot-clé from

1.
Quelle instruction import serait nécessaire avant d'exécuter print(sqrt(25)) ?
  1. from math import sqrt
  2. import sqrt from math
  3. import math
2.
Combien de variables sont définies par l'instruction from math import sin, cos, tan ?
  1. 0
  2. 3
  3. 4
3.
Quelle erreur se produirait si l'on tentait d'appeler une fonction qui n'a pas été importée ?
  1. ImportError
  2. NameError
  3. SyntaxError

Collisions de noms

Des modules écrits par différents programmeurs peuvent utiliser le même nom pour une fonction. Une collision de noms (name collision) se produit lorsqu'une fonction est définie plusieurs fois. Si une fonction est définie plus d'une fois, la définition la plus récente est utilisée :

    from area import cube

    def cube(x):    # Name collision (replaces the imported function)
      return x ** 3
    
    print(cube(2)) # Calls the local cube() function, not area.cube()

Un programmeur pourrait ne pas se rendre compte que la fonction cube est définie deux fois car aucune erreur ne se produit lors de l'exécution du programme. Les collisions de noms ne sont pas considérées comme des erreurs et conduisent souvent à un comportement inattendu.

Il convient d'être vigilant pour éviter les collisions de noms. Sélectionner des fonctions spécifiques à importer depuis un module réduit l'empreinte mémoire ; cependant, importer un module complet peut aider à éviter les collisions car les noms sont alors qualifiés sous la forme module.name. C'est un compromis que le programmeur doit prendre en compte.

Faites le point

Noms de modules et de fonctions

Concepts en pratique

Collisions de noms

4.
Un programme commence par from area import square, circle. Quel code provoque une collision de noms ?
  1. def area(phone):
      """Gets the area code of a phone number."""
    
  2. def circle(x, y, size):
      """Draws a circle centered at (x, y)."""
    
  3. def is_square(length, width):
      """Returns True if length and width are equal."""
    
5.
Un programme commence par import area. Quel code provoque une collision de noms ?
  1. area = 51
    
  2. import cylinder from volume
    
  3. def cube(size):
      """Generates a "size X size" rubik's cube."""
    
6.
Quelle ligne provoquera une erreur ?
1
def hello():
2
  print("Hello!")
3
4
def hello(name):
5
  print("Hello,", name)
6
7
hello()
8
hello("Chris")
  1. ligne 4
  2. ligne 7
  3. ligne 8

Pour aller plus loin

Si un nom est défini, importé ou affecté plusieurs fois, Python utilise la définition la plus récente. D'autres langages permettent à plusieurs fonctions d'avoir le même nom si les paramètres sont différents. Cette fonctionnalité, appelée surcharge de fonction, ne fait pas partie du langage Python.

À vous d'essayer

Importations manquantes

Ajoutez les instructions import manquantes en haut du fichier. N'apportez aucune modification au reste du code. Au final, le programme devrait s'exécuter sans erreur.

À vous d'essayer

Cadeaux de fête

Le programme suivant ne s'exécute pas correctement en raison de collisions de noms. Corrigez le programme en modifiant les instructions import, les appels de fonction et les affectations de variables. La sortie devrait être :

    Bouncy ball area: 13
    Bouncy ball volume: 4
    Cone hat area: 227
    Cone hat volume: 209