Question

Dans certains de mes Django applications que je suis à l'aide d'un settings_local.py fichier pour remplacer les paramètres qui sont différentes sur les différents environnements (par exemple,de développement, de test et de production).J'ai à l'origine utilisé le code suivant pour ajouter son contenu dans le settings.py:

try:
    from settings_local import *
except ImportError:
    sys.stderr.write("The settings_local.py file is missing.\n")
    DEBUG=False

J'ai récemment découvert l' execfile fonction et sont passés à quelque chose comme:

try:
    execfile(path.join(PROJECT_ROOT, "settings_local.py"))
except IOError:
    sys.stderr.write("The settings_local.py file is missing.\n"
    DEBUG=False

Les deux fonctionnent comme prévu, mais je suis curieux de savoir si je suis absent toute pièges, et, en général, l'approche qui est plus recommandé et pourquoi.

Était-ce utile?

La solution

À l'aide de execfile la fonction aura lieu à l'évaluation de l'Python fichier source (.py) chaque fois que le fichier de paramètres est évaluée.Vous êtes l'exécution de l'Python analyseur à chaque fois.À l'aide de import ne serait pas nécessairement le faire (peut utiliser l' .pyc fichier).En général, la première fois que vous lancez un projet en Python (au moins, disponible), il sera compilé en bytecode et pas recompilé à nouveau.Vous êtes en rupture que la.Ce n'est pas nécessairement un problème, mais vous devez être conscient de cela.

À l'aide de execfile il résultera aussi de l'ensemble des importations que vous avez dans la settings_local.py fichier en cours de ré-évalué dans le module de la portée de l' settings.py fichier.À l'aide de import * comprend tous les éléments de la settings_local.py portée de module.L'effet net est le même (tous les éléments inclus dans settings_local.py portée de module sont inclus dans settings.py), mais la méthode est différente.

Enfin, il est normal pour les modules à être exécutés comme des modules plutôt que de inclus.Il est raisonnable de code pour inclure des choses telles que os.path.dirname(__file__).Si aucun code n'utilisez ce faire, vous devez confondre, comme le code ne serait plus être en cours d'exécution dans le module que l'auteur peut raisonnablement s'attendre.

Dans mon expérience, les gens utilisent import pas execfile.Django est très bien "convention over configuration".Suivre la convention.

Autres conseils

Autre différence:execfile obtient un contexte dictionnaire;le contexte mondial par défaut ou dictionnaire spécifié.Cela pourrait permettre à des choses étranges

dont_do_this.py:

# Probably not a good thing to do
z=x+1  # an expression that involves an un-defined field

De toute évidence,

from dont_do_this import *

échoue.

Cependant,

d={'x':1}
execfile( 'dont_do_this.py', d )

est OK et les résultats dans d=={'x':1, 'z':2}

Notez que

x=1
execfile( 'dont_do_this.py' )

est OK et les résultats dans la variable z d'être ajoutée à la globals.

La première version (from settings_local import * est ce que tout le monde s'attendrait à voir.Il permettra également de laisser des analyseurs de code trouver le module.

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