Historique de la question
Les Namespaces (espaces de noms) sont l'une des concepts fondamentaux de Python, présents depuis les premières implémentations du langage. Ils sont destinés à organiser les noms afin d'éviter les conflits entre les variables, les fonctions et les classes des différentes parties du programme.
Problème
Dans les grands projets, un grand nombre de fonctions, de classes, de variables et de modules apparaissent. Sans une utilisation correcte des namespaces, on risque d'écraser des noms importants, de rencontrer des ombres de variables inattendues et des difficultés lors des tests et de l'extension.
Solution
En Python, un namespace est un mappage associant des noms à des objets. Il existe différents niveaux d'espaces de noms : local, global, espaces de modules, et classes. Comprendre cette division garantit un accès correct aux objets nécessaires et minimise les conflits.
Exemple de code :
def foo(): x = 10 # x dans l'espace de noms local de la fonction print(x) y = 20 # y dans l'espace de noms global du module foo() print(y)
Caractéristiques clés :
Que se passe-t-il si l'on déclare une variable locale avec le même nom qu'une variable globale dans la même fonction ?
La variable locale "éclipsera" la variable globale pendant l'exécution de la fonction ; en dehors de la fonction, la variable globale restera inchangée.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
Comment obtenir une liste de tous les noms dans l'espace de noms actuel ?
Les fonctions locals(), globals(), dir() renvoient les mappages ou listes de noms correspondants dans l'espace de noms / portée actuelle.
Quelles sont les différences entre les espaces de noms des classes et des instances ?
L'espace de noms de la classe définit les attributs communs à toutes les instances de la classe. L'espace de noms de l'instance — les attributs d'un objet spécifique. Les changements dans l'instance n'affectent pas la classe, et vice versa.
Utilisation de from mymodule import * dans toutes les parties d'un grand projet. En conséquence, les noms de fonctions ont été écrasés, des bugs difficiles à attraper sont apparus en raison de conflits de noms entre les paquets.
Avantages :
Inconvénients :
Passage à des aliases d'importation (import mymodule as mm), structuration claire des modules.
Avantages :
Inconvénients :