2013-09-30 4 views
3

Je gère un dictionnaire et il est chargé dans le fichier de configuration. Le dictionnaire est chargé à partir d'un fichier JSON.Déclaration d'importation: fichier de configuration Python

Dans config.py

name_dict = json.load(open(dict_file)) 

Je suis importer ce fichier de configuration dans plusieurs autres scripts (file1.py, file2.py, ..., filen.py) en utilisant

import config 

déclaration. Ma question est quand le script config.py sera-t-il exécuté? Je suis sûr qu'il ne sera pas exécuté pour chaque appel d'importation qui est fait dans mes multiples scripts. Mais, que se passe-t-il exactement lorsqu'une instruction d'importation est appelée.

Répondre

2

Le code de niveau supérieur dans un module est exécuté une fois, la première fois que vous le codez. Après cela, l'objet module sera trouvé dans sys.modules, et le code ne sera pas ré-exécuté pour le re-générer.

Il y a quelques exceptions à ceci:

  • reload, évidemment.
  • Importation accidentelle du même module sous deux noms différents (par exemple, si le module est dans un paquet, et que vous avez un répertoire au milieu du paquet dans sys.path, vous pourriez vous retrouver avec mypackage.mymodule et mymodule étant deux copies de la même chose, auquel cas le code est exécuté deux fois).
  • Installation de crochets d'importation/personnalisés importés qui remplacent le comportement standard.
  • Explicitement monkeying avec sys.modules.
  • Appel direct des fonctions sur imp/importlib ou similaire.
  • Certains cas avec multiprocessing (et les modules qui l'utilisent indirectement, comme concurrent.futures).

Pour Python 3.1 et versions ultérieures, tout cela est décrit en détail dans The import system. En particulier, regardez la section Recherche. (Les cas spécifiques multiprocessing sont décrits pour ce module.)

Pour les versions antérieures de Python, vous devez pratiquement déduire le comportement d'une variété de sources différentes et lire le code ou expérimenter. Cependant, le nouveau comportement bien documenté est conçu pour fonctionner comme l'ancien comportement, sauf de manière spécifiquement décrite, de sorte que vous pouvez généralement vous en tenir à lire les documents 3.x même pour 2.x.


Notez que en général, vous ne voulez pas compter sur si le code de niveau supérieur dans le module est exécuté une ou plusieurs fois. Par exemple, étant donné une définition de fonction de niveau supérieur, tant que vous ne comparez jamais les objets de fonction, ou que vous affectez des globales (dépend de la définition elle-même, pas seulement du corps), cela ne fait aucune différence. Cependant, il existe quelques exceptions à cela, et le chargement des fichiers de configuration au démarrage est un parfait exemple d'exception.

Questions connexes