web-dev-qa-db-fra.com

Quels sont les espaces de noms Python?

Je viens de commencer à apprendre Python et je suis tombé sur "namespaces" concept en Python. Bien que je connaisse ce qu’il en est, je suis incapable d’apprécier la gravité de ce concept. 

Certaines recherches sur le net ont révélé que l'une des raisons allant à l'encontre de PHP est qu'il ne possède pas de support natif pour les espaces de noms.

Quelqu'un pourrait-il expliquer comment utiliser les espaces de noms et comment cette fonctionnalité améliore la programmation (pas seulement en Python, car je suppose que les espaces de noms ne sont pas un concept limité à un langage particulier). 

Je viens principalement des environnements de programmation Java et C.

38
Srikar Appalaraju

L'espace de noms est un moyen d'implémenter la portée.

En Java (ou C), le compilateur détermine où une variable est visible via une analyse de portée statique. 

  • En C, scope est soit le corps d’une fonction, soit globale, soit externe. Le compilateur raisonne cela pour vous et résout chaque nom de variable en fonction de règles de portée. Les noms externes sont résolus par l'éditeur de liens une fois tous les modules compilés.

  • En Java, scope est le corps d'une fonction de méthode ou de toutes les méthodes d'une classe. Certains noms de classe ont également une portée au niveau du module. Encore une fois, le compilateur découvre cela au moment de la compilation et résout chaque nom en fonction des règles de portée.

En Python, chaque fonction package, module, classe, fonction et méthode possède un "espace de noms" dans lequel les noms de variables sont résolus. De plus, un espace de noms global est utilisé si le nom ne figure pas dans l'espace de noms local.

Chaque nom de variable est vérifié dans l’espace de noms local (le corps de la fonction, le module, etc.), puis dans l’espace de noms global.

Les variables sont généralement créées uniquement dans un espace de noms local. Les instructions global et nonlocal peuvent créer des variables autres que l'espace de noms local.

Lorsqu'une fonction, une méthode, un module ou un package est évalué (c'est-à-dire qu'il commence l'exécution), un espace de noms est créé. Pensez-y comme un "contexte d'évaluation". Quand une fonction ou une méthode, etc., termine son exécution, l'espace de nom est supprimé. Les variables sont supprimées. Les objets peuvent également être déposés.

44
S.Lott

Les espaces de noms évitent les conflits entre les classes, les méthodes et les objets du même nom qui auraient pu être écrits par différentes personnes.

Venant d’un contexte Java, vous savez probablement comment cela est réalisé en utilisant des packages, par exemple. vous pouvez créer une classe movieyoda.DateUtils et je peux créer une classe mikej.DateUtils et le package permet au code d'utiliser les classes pour les distinguer. (Python a quelque chose de très similaire .)

Les espaces de noms ont été ajoutés à PHP dans la version 5.3.0, mais dans les versions précédentes (et dans d'autres langages ne fournissant pas d'espaces de noms), vous devez préfixer vos noms de classe et de méthode avec un nom permettant de réduire le risque de conflit de noms. par exemple. une fonction movieyoda_parse_file.

5
mikej

Pour comprendre les espaces de noms, vous devez également comprendre un peu les modules en Python. Un module est simplement un fichier contenant du code Python. Ce code peut être sous la forme de classes Python, de fonctions ou simplement d'une liste de noms. Chaque module reçoit ses propres espaces de noms globaux. Ainsi, vous ne pouvez pas avoir deux classes ou deux fonctions dans le même module avec le même nom car elles partagent l’espace de noms du module.

référence: http://bytebaker.com/2008/07/30/python-namespaces/

3
shahjapan

Si vous créez un gros programme avec quelqu'un d'autre, vous pouvez écrire votre propre partie du programme comme vous le souhaitez. Toutes les variables du fichier seront privées, il n'y aura pas de collision . Lorsque vous écrivez des programmes PHP, il est facile de réécrire des variables globales par erreur. En python, vous pouvez importer d'autres variables de modules si vous le souhaitez, et elles seront "globales" sur votre module.

Vous pourriez penser à un fichier un objet en Python. Lorsque vous écrivez des programmes PHP, vous pouvez obtenir le même résultat en écrivant des classes avec des variables d'instance.

0
Adam Wallner

Je complète la réponse de S.Lott.

Je dirais que l'espace de nom est un moyen d'implémenter la gestion des noms dans une étendue, car une étendue fait plus que la gestion des noms.

En C, les portées sont de 4 types: paramètres globaux, de fonction, de bloc et de fonction (prototype). Chacun de ces types peut créer un ou plusieurs espaces de noms, en fonction des besoins. Il y a 4 ns dans C - balises pour s/u/e - identifiants pour les noms de types, noms de fonctions et noms de variables - paramètres dans le prototype de fonction - membres et champs de bits dans s/u.

De cette manière, les identificateurs de balises et les noms de fonctions ne sont pas en conflit, mais les noms de types définis par typedef peuvent être en conflit avec les noms de variables.

En python, il existe un espace de noms intégré qui inclut le ns global, et le ns global est fourni par le module chargé. Les éléments intégrés contiennent des variables. Un symbole pour une variable peut définir un objet ou une fonction - par exemple, + y est défini. Le ns global du module dure jusqu'à la fin.

Voir aussi que et bien sûr que .

0
alinsoar