120 votes

Puis-je utiliser __init__.py pour définir des variables globales?

Je veux définir une constante qui devrait être disponible dans tous les sous-modules d'un paquet. J'ai pensé que la meilleure place serait dans le fichier __init__.py du paquet racine. Mais je ne sais pas comment faire ça. Supposons que j'ai quelques sous-paquets et chacun avec plusieurs modules. Comment puis-je accéder à cette variable à partir de ces modules?

Bien sûr, si cela est totalement faux et qu'il existe une meilleure alternative, j'aimerais bien le savoir.

180voto

Jason R. Coombs Points 11130

Vous devriez être en mesure de les mettre en __init__.py. Cela se fait tout le temps.

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT

Ensuite, importez mon_module:

>>> from mypackage import mymodule
my constant is 42

Encore, si vous avez des constantes, il serait raisonnable (meilleures pratiques, probablement) à mettre dans un module séparé (constants.py, config.py, ...), et ensuite si vous le souhaitez dans le paquet de noms, de les importer.

mypackage/__init__.py:

from mypackage.constants import *

Pourtant, cela n'a pas d'inclure automatiquement les constantes dans les espaces de noms du paquet de modules. Chacun des modules dans le package sera obligée d'importer des constantes explicitement, soit à partir de mypackage ou de mypackage.les constantes.

31voto

Ferdinand Beyer Points 27723

Vous ne pouvez pas le faire. Vous devrez importer explicitement vos constantes dans l'espace de noms de chaque module. Le meilleur moyen d'y parvenir est de définir vos constantes dans un module "config" et de les importer où vous le souhaitez:

 # mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *
 

2voto

u0b34a0f6ae Points 14874

Vous pouvez définir des variables globales à partir de n'importe où, mais c'est vraiment une mauvaise idée. l'importation de l' __builtin__ module et de modifier ou d'ajouter des attributs à ce module, et tout à coup vous avez de nouveaux builtin des constantes ou des fonctions. En fait, lorsque mon application s'installe gettext, j'ai l' _() de la fonction dans tous mes modules, sans importer quoi que ce soit. Donc, c'est possible, mais seulement pour des Applications de type de projets, pas pour des ensembles réutilisables ou de modules.

Et je suppose que personne ne recommanderais cette pratique de toute façon. Quel est le problème avec un espace de noms? Ladite demande a la version du module, de sorte que j'ai "global", les variables disponibles, version.VERSION, version.PACKAGE_NAME etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X