Site original : Sam & Max: Python, Django, Git et du cul
Un mot qui vient et qui revient comme on en a des tas en informatique, et qui est utilisé par tout le monde comme si chacun était supposé savoir.
Très énervant quand on ne sait pas ce que ça veut dire.
Un namespace, ou espace de noms, est simplement un conteneur de noms, un groupe.
On s’en sert pour pouvoir distinguer deux choses qui ont le même nom.
Par exemple, un trou du cul peut être un anus ou un connard. Si quelqu’un fait la mention d’un “trou du cul”, j’ai besoin de contexte pour savoir si il parle d’un orifice ou d’un fils d’horreur. Ce contexte peut être donné par un namespace.
Comment est représenté un namespace dépend de l’outil utilisé.
Ainsi, en XML, c’est un préfixe puis deux points :
<xsd:element></xsd:element> <taoisme:element></taoisme:element>
Ici j’ai deux balises “element”, mais elles sont préfixées par deux namespaces : xsd
et taoisme
.
C’est tout. Il n’y a rien d’autre caché derrière le namespace, c’est simplement un moyen de s’assurer qu’on sait bien de quoi on parle.
Certains namespaces sont standardisés. Par exemple, xsd
est un namespace réservé aux balises qu’on retrouve dans un fichier .xsd. D’autres sont créés par les utilisateurs pour des raisons d’organisation.
En effet, un des avantages du namespace, c’est qu’il évite que deux références homonymes ne s’écrasent l’une l’autre.
Par exemple en Python, le nom du module qui contient une fonction peut servir de namespace.
Si je fais :
import os import shelve
Alors j’ai accès à trois fonctions open():
open()
du module os
dont le nom est préfixé par le namespace os.open()
du module shelve
dont le nom est prefixé par le namespace shelve.open()
dont le nom n’est PAS préfixé est qui est donc dans le namespace en cours.Et aucune fonction ne s’écrase l’une l’autre. Le nom du module, étant utilisé comme namespace, permet la distinction pour l’humain ET la machine.
Dans ce langage, cependant, on peut copier une référence d’un namespace à l’autre. Par exemple :
from datetime import date
Ceci va importer date
et le rendre disponible dans le namespace en cours. Du coup on aura pas besoin de préfixer date
pour l’utiliser dans le namespace en cours, mais en contrepartie, on ne pourra pas créer de variable date
car cela écraserait la référence précédente.
Si vous prenez par exemple PHP 5 qui n’avait pas encore de mécanisme de namespace à l’époque, les dev étaient obligés de créer artificiellement un namespace en allongeant le nom de toutes leurs fonctions avec ‘sujet_’. Ce qui donnait des noms à rallonge du genre : mysql_real_escape_string().