Question

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

Bien sûr, si cela est totalement faux, et il y a une meilleure alternative, je voudrais savoir.

Était-ce utile?

La solution

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, l'importation mymodule:

>>> from mypackage import mymodule
my constant is 42

Pourtant, si vous avez des constantes, il serait raisonnable (les meilleures pratiques, sans doute) pour les mettre dans un module séparé (constants.py, config.py, ...) et si vous les voulez dans le paquet espace de noms, de les importer.

mypackage/__init__.py :

from mypackage.constants import *

Pourtant, cela ne comprend pas automatiquement les constantes dans les espaces de noms des modules de paquet. Chacun des modules dans le paquet devra encore importer des constantes explicitement soit à partir mypackage ou de mypackage.constants.

Autres conseils

Vous ne pouvez pas faire cela. Vous devrez importer vos constantes dans explicitement l'espace de noms de chaque module. La meilleure façon d'y parvenir est de définir vos constantes dans un module « config » et l'importer partout vous en avez besoin:

# mypackage/config.py
MY_CONST = 17

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

Vous pouvez définir des variables globales de partout, mais il est une très mauvaise idée. importer le module __builtin__ et modifier ou ajouter des attributs à ces modules, et tout à coup vous avez de nouvelles constantes ou fonctions prédéfinies. En fait, lorsque mon application installe gettext, je reçois le _ () dans tous mes modules, sans rien importer. Donc, cela est possible, mais bien sûr que pour les projets de type d'application, pas pour emballages réutilisables ou modules.

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

Je voulais juste ajouter que les constantes peuvent être employés en utilisant un fichier config.ini et analysés dans le script en utilisant la bibliothèque ConfigParser. De cette façon, vous pourriez avoir des constantes de multiples circonstances. Par exemple, si vous les aviez constantes de paramètres pour deux requêtes d'URL séparées étiquette comme ceci:

mymodule/config.ini
[request0]
conn = 'admin@localhost'
pass = 'admin'
...

[request1]
conn = 'barney@localhost'
pass = 'dinosaur'
...

J'ai trouvé la documentation sur le site Python très utile. Je ne sais pas s'il y a des différences entre Python 2 et 3 voici donc les liens à la fois:

Pour Python 3: https://docs.python.org/ 3 / bibliothèque / configparser.html # module ConfigParser

Pour Python 2: https://docs.python.org/ 2 / bibliothèque / configparser.html # module ConfigParser

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top