Python-Muster für die Freigabe der Konfiguration der gesamten Anwendung
Ich habe eine Anwendung, bestehend aus einer Basis-app, die Sie bringt in mehreren Modulen. Die Basis-app liest eine parameter-Datei in einem Konfigurations-hash, und ich will es in allen meinen Modulen.
Derzeit leite ich ein "Eltern" - Objekt nach unten auf Module, und dann die Module Dinge tun, wie von selbst.Eltern.config die Konfiguration bezogen werden.
Allerdings, so gibt es mehrere Ebenen, um die Modul-Hierarchie, finde ich mich Dinge zu tun, wie sich selbst.Eltern.Eltern.config, die beginnt zu schlecht Aussehen.
Was sind einige bessere Muster für die Freigabe eines config-Objekt über eine Anwendung und es sind die Module? Ich am nachdenken über einen 'config' module, die im wesentlichen erstellt eine Globale config-variable, die gesetzt werden können, von der Basis-app, dann importiert und auf die anderen Module, aber ich bin nicht sicher, ob mit globals wie das ist eine schlechte Praxis aus anderen Gründen.
Ich bin halbwegs neu, um Python so schön =)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man nur:
haben und eine Globale config-Modul
Auszüge aus meinen Kommentaren:
Können Sie immer fügen Sie spezielle Regeln für merkwürdige Situationen, indem Sie einfach nur sagen
oddValue if isOddSituation() else config.normalValue
.Wenn Sie wollen, um Konfigurations-Module werden hierarchisch subclassable (wie bei meiner anderen Antwort beschrieben), dann können Sie repräsentieren eine config als Klasse, oder Sie können die
copy
- Modul und stellen Sie eine flache Kopie und ändern Sie es, oder Sie können eine "config dictionary", z.B.:Ist es eigentlich egal, zu viel, welcher Bereich Sie sind in.
oddValue if isOddSituation() else config.normalValue
. Wenn Sie wollen, um Konfigurations-Module werden hierarchisch subclassable (wie bei meiner anderen Antwort beschrieben), dann können Sie repräsentieren eine config als Klasse, oder Sie können diecopy
- Modul und stellen Sie eine flache Kopie und ändern Sie es, oder Sie können eine "config dictionary", z.B.config = dict(baseConfig, overriddenValue=etc)
Die Beantwortung der alten Frage:
Nur dependency-injection-vorgeschlagen von @Reed Copsey hier. E. g.
Ich denke, 'module', Sie sind eigentlich bezieht sich auf eine 'Klasse/Objekt". Ein Objekt ist eine Instanz einer Klasse, zum Beispiel:
Ein-Modul ist .py-Datei, die Sie importieren, etwa so:
Scheint es unwahrscheinlich, dass alle Klassen, die Sie instanziieren möchten, um Zugriff auf eine Globale Konfiguration. Allerdings, wenn Sie wirklich brauchen, alles, was in Ihrer Anwendung für den Zugriff auf einige Globale Parameter, können Sie setzen Sie Sie in Ihrem eigenen
config
Modul:und dann von jedem Modul oder ein beliebiges Objekt oder irgendwo wirklich, so lange wie du bist
import config
könnte man einfach sagenprint(config.myParam1)
Alternativ, wenn Sie möchten, eine große Hierarchie von Objekten, die alle teilen, Zugriff auf die gleiche Eigenschaft, die Sie nicht brauchen, zu beziehen über die manuelle Einstellung einer
self.parent
. So lange, wie Sie die Vererbung verwenden, die Sie tun können, Sachen wie:Werfen Sie einen Blick auf diese. Es könnte Ihnen helfen:
https://gist.github.com/dgarana/c052a3287629dd7c0b0c9d7921081e9d