2012-09-19 5 views
8

In meiner Anwendung verwende ich Modul im Paket example namens examplemod.Wie kann ich eine Konstante in einem importierten Python-Modul überschreiben?

Meine App:

from example import examplemod 
examplemod.do_stuff() 

Es ein anderes Modul innerhalb example wie so importiert.

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config verwendet eine Konstante.

config.py:

CONSTANT = "Unfortunate value" 

Ich möchte diese Konstante außer Kraft zu setzen, wenn ich examplemod in meiner Anwendung bin (es CONSTANT = "Better value" Einstellung) und ich würde es vorziehen, nicht die zugrunde liegende zu ändern Modul, damit ich mein eigenes Paket nicht beibehalten muss. Wie kann ich das machen?

+0

Ich könnte falsch liegen, aber ich denke, Sie können nur einen Wert der Variablen zuweisen, sobald es importiert wurde. – Borgleader

Antwort

3

Vielen Dank für Ihre Antworten. Sie wiesen mich in die richtige Richtung, obwohl keiner von ihnen wie geschrieben funktionierte. Ich landete die folgenden Schritte ausführen:

import example.config 
example.config.CONSTANT = "Better value" 

from example import examplemod 
examplemod.do_stuff() 
# desired result! 

(Auch ich bin ein Patch an das Modul Maintainer Absenden CONSTANT eine konfigurierbare Option zu machen, damit ich dies nicht tun, müssen aber müssen die Lager-Modul installieren in der Zwischenzeit.)

1

Ich bin mir nicht sicher, ob dies genug ist oder nicht, aber haben Sie versucht:

from example import config 
config.CONSTANT = "A desirable value" 

Stellen Sie sicher, dies zu tun, bevor examplemod importiert wird. Dies sollte funktionieren, weil Python die Importe so zwischenspeichert, dass die config, die Sie geändert haben, dieselbe ist, die examplemod bekommt.

1

Dies wird monkey patching genannt, und es ist ziemlich häufig, obwohl nicht bevorzugt, wenn es eine andere Art und Weise ist das Gleiche zu erreichen:

examplemod.config.CONSTANT = "Better value" 

Das Problem ist, dass Sie auf die Interna von examplemod angewiesen sind und config verbleibende Gleiches, so könnte dies brechen, wenn sich eines der Module ändert.

12

Ja, aber es wird nur mit vollqualifizierten Zugangsweg zu Modulen wie erwartet:

import example 
example.examplemod.config.CONSTANT = "Better value" 
example.examplemod.do_stuff() 
+0

Erwähnenswert ist auch, dass, wenn das Beispielmodul CONSTANT direkt in seine Symboltabelle mit der 'from config import CONSTANT'-Syntax importiert, Sie' example.examplemod.CONSTANT = "Besserer Wert" 'machen müssten, da examplemod dann hätte ein eigener Verweis auf CONSTANT. Das Formular, das Sie verwenden, ersetzt config.CONSTANT, was in dem Fall funktioniert, dass das examplemod Modul 'from examplemod import config verwendet; config.CONSTANT'. – Symmetric

Verwandte Themen