Je souhaite définir une constante qui devrait être disponible dans tous les sous-modules d'un package. J'ai pensé que le meilleur endroit serait dans le __init__.py
fichier du paquet racine. Mais je ne sais pas comment faire ça. Supposons que j'ai quelques sous-packages 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 le savoir.
from . import MY_CONSTANT
from mypackage.constants import *
placera des copies deMY_CONSTANT
dans chaque sous-module plutôt qu'une référence à la même variableMY_CONSTANT
dans l'un des modules, il muterait partout. Si vous deviez réassigner l'MY_CONSTANT
un des modules, cela n'affecterait que ce module. Si c'est votre intention, vous devez référencer par attribut, c'est-à-diremypackage.constants.MY_CONSTANT
.mymodule.py
dans__init__.py
avantMY_CONSTANT = 42
que échouera parce que lorsque l' importationmymodule.py
MY_CONSTANT
n'a pas encore été défini. Il faut donc passerMY_CONSTANT = 42
auimport mymodule
Tu ne peux pas faire ça. Vous devrez importer explicitement vos constantes dans l'espace de noms de chaque module individuel. La meilleure façon d'y parvenir est de définir vos constantes dans un module "config" et de l'importer partout où vous en avez besoin:
la source
sys.modules
.Vous pouvez définir des variables globales de n'importe où, mais c'est une très mauvaise idée. importez le
__builtin__
module et modifiez ou ajoutez des attributs à ces modules, et soudainement vous avez de nouvelles constantes ou fonctions intégrées. En fait, lorsque mon application installe gettext, j'obtiens la fonction _ () dans tous mes modules, sans rien importer. C'est donc possible, mais bien sûr uniquement pour les projets de type Application, pas pour les packages ou modules réutilisables.Et je suppose que personne ne recommanderait cette pratique de toute façon. Quel est le problème avec un espace de noms? Cette application a le module de version, de sorte que j'ai des variables "globales" disponibles comme
version.VERSION
,version.PACKAGE_NAME
etc.la source
Je voulais juste ajouter que les constantes peuvent être utilisées à l'aide d'un fichier config.ini et analysées dans le script à l'aide de la bibliothèque configparser. De cette façon, vous pouvez avoir des constantes pour plusieurs circonstances. Par exemple, si vous aviez des constantes de paramètres pour deux demandes d'URL distinctes, étiquetez-les comme suit:
J'ai trouvé la documentation sur le site Web de Python très utile. Je ne suis pas sûr s'il existe des différences entre Python 2 et 3, alors voici les liens vers les deux:
Pour Python 3: https://docs.python.org/3/library/configparser.html#module-configparser
Pour Python 2: https://docs.python.org/2/library/configparser.html#module-configparser
la source