Je me suis demandé s'il serait possible d'éviter certains des inconvénients liés à l'utilisation de variables globales (voir par exemple http://wiki.c2.com/?GlobalVariablesAreBad ) en utilisant un espace de noms de classe plutôt qu'un espace de noms global / module pour passer des valeurs de variables . Le code suivant indique que les deux méthodes sont essentiellement identiques. Il y a un léger avantage à utiliser les espaces de noms de classe comme expliqué ci-dessous.
Les fragments de code suivants montrent également que des attributs ou des variables peuvent être créés et supprimés dynamiquement dans les espaces de noms globaux / module et les espaces de noms de classe.
wall.py
# Note no definition of global variables
class router:
""" Empty class """
J'appelle ce module «mur» car il est utilisé pour rebondir des variables sur. Il agira comme un espace pour définir temporairement les variables globales et les attributs à l'échelle de la classe de la classe vide 'router'.
source.py
import wall
def sourcefn():
msg = 'Hello world!'
wall.msg = msg
wall.router.msg = msg
Ce module importe le mur et définit une fonction unique sourcefn
qui définit un message et l'émet par deux mécanismes différents, l'un via les globaux et l'autre via la fonction routeur. Notez que les variables wall.msg
et wall.router.message
sont définies ici pour la première fois dans leurs espaces de noms respectifs.
dest.py
import wall
def destfn():
if hasattr(wall, 'msg'):
print 'global: ' + wall.msg
del wall.msg
else:
print 'global: ' + 'no message'
if hasattr(wall.router, 'msg'):
print 'router: ' + wall.router.msg
del wall.router.msg
else:
print 'router: ' + 'no message'
Ce module définit une fonction destfn
qui utilise les deux mécanismes différents pour recevoir les messages émis par la source. Cela permet la possibilité que la variable «msg» n'existe pas. destfn
supprime également les variables une fois qu'elles ont été affichées.
main.py
import source, dest
source.sourcefn()
dest.destfn() # variables deleted after this call
dest.destfn()
Ce module appelle les fonctions précédemment définies dans l'ordre. Après le premier appel aux dest.destfn
variables wall.msg
et wall.router.msg
n'existent plus.
La sortie du programme est:
global: Bonjour tout le monde!
routeur: Bonjour tout le monde!
global: pas de
routeur de message : pas de message
Les fragments de code ci-dessus montrent que les mécanismes de variable module / global et classe / classe sont essentiellement identiques.
Si beaucoup de variables doivent être partagées, la pollution de l'espace de noms peut être gérée soit en utilisant plusieurs modules de type mur, par exemple wall1, wall2 etc., soit en définissant plusieurs classes de type routeur dans un seul fichier. Ce dernier est légèrement plus ordonné, donc représente peut-être un avantage marginal pour l'utilisation du mécanisme de variable de classe.