Frage

In einigen meiner Django-Apps verwende ich a settings_local.py Datei, um Einstellungen zu überschreiben, die in verschiedenen Umgebungen unterschiedlich sind (z. B.Entwicklung, Test und Produktion).Ich habe ursprünglich den folgenden Code verwendet, um seinen Inhalt in die einzubinden settings.py:

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

Ich habe das kürzlich gefunden execfile Funktion und wechselte zu etwas wie:

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

Beide funktionieren wie beabsichtigt, aber ich bin gespannt, ob mir irgendwelche Fallstricke entgehen und welcher Ansatz generell empfehlenswerter ist und warum.

War es hilfreich?

Lösung

Benutzen execfile Die Funktion führt jedes Mal zur Auswertung der Python-Quelldatei (.py), wenn die Einstellungsdatei ausgewertet wird.Sie führen jedes Mal den Python-Parser aus.Benutzen import würde dies nicht unbedingt tun (könnte die .pyc-Datei verwenden).Wenn Sie ein Projekt zum ersten Mal in Python (zumindest cPython) ausführen, wird es im Allgemeinen in Bytecode kompiliert und nicht erneut kompiliert.Das machst du kaputt.Dies ist nicht unbedingt ein Problem, aber Sie sollten sich dessen bewusst sein.

Benutzen execfile führt auch zu allen Importen, die Sie möglicherweise in der haben settings_local.py Datei, die im Modulbereich des neu ausgewertet wird settings.py Datei.Benutzen import * hätte alle Artikel in der enthalten settings_local.py Modulumfang.Der Nettoeffekt ist derselbe (alle darin enthaltenen Elemente). settings_local.py Modulumfang sind darin enthalten settings.py), aber die Methode ist anders.

Schließlich ist es normal, dass Module als Module ausgeführt und nicht eingebunden werden.Es ist sinnvoll, dass Code Dinge enthält wie os.path.dirname(__file__).Wenn irgendein Code dies verwenden würde, wäre es verwirrend, da der Code nicht mehr in dem Modul ausgeführt würde, das der Autor vernünftigerweise erwartet hätte.

Nach meiner Erfahrung nutzen die Leute import nicht execfile.Bei Django geht es vor allem um „Konvention statt Konfiguration“.Befolgen Sie die Konvention.

Andere Tipps

Ein weiterer Unterschied:execfile ruft ein Kontextwörterbuch ab;Der globale Kontext standardmäßig oder ein angegebenes Wörterbuch.Dies könnte einige seltsame Dinge zulassen

dont_do_this.py:

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

Offensichtlich,

from dont_do_this import *

scheitert.

Jedoch,

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

ist in Ordnung und führt zu d=={'x':1, 'z':2}

Beachten Sie, dass

x=1
execfile( 'dont_do_this.py' )

ist in Ordnung und ergibt die Variable z wird zu den Globals hinzugefügt.

Die erste Version (from settings_local import *) ist das, was jeder erwarten würde.Dadurch können Code-Analysatoren das Modul auch finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top