2012-09-19 7 views
8

Nella mia applicazione sto usando il modulo all'interno del pacchetto example chiamato examplemod.Come posso eseguire l'override di una costante in un modulo Python importato?

mia app:

from example import examplemod 
examplemod.do_stuff() 

Importa un altro modulo all'interno example in questo modo.

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config usa una costante.

config.py:

CONSTANT = "Unfortunate value" 

mi piacerebbe ignorare questo costante quando sto usando examplemod nella mia applicazione (impostandolo a CONSTANT = "Better value") e preferisco non modificare il sottostante modulo quindi non devo mantenere il mio pacchetto. Come posso fare questo?

+0

Potrei sbagliarmi ma penso che sia possibile assegnare un valore alla variabile una volta che è stata importata. – Borgleader

risposta

3

Grazie a tutti per le vostre risposte. Mi hanno indicato nella giusta direzione, anche se nessuno di loro ha funzionato come scritto. Ho finito per fare il seguente:

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

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

(Inoltre, mi sto presentando una patch al manutentore del modulo per fare COSTANTE un'opzione configurabile in modo da non devo fare questo, ma bisogno di installare il modulo magazzino nel frattempo.)

1

io non sono sicuro se questo è sufficiente o no, ma hai provato:

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

Assicurati di farlo prima examplemod viene importato. Questo dovrebbe funzionare perché le importazioni di cache Python sono così che lo config modificato sarà lo stesso ottenuto da examplemod.

1

questo è chiamato monkey patching, ed è abbastanza comune anche se non preferito se c'è un altro modo per ottenere la stessa cosa:

examplemod.config.CONSTANT = "Better value" 

Il problema è che vi affidate ai la struttura interna di examplemod e config rimanendo la lo stesso, quindi questo potrebbe rompersi se uno dei moduli cambia.

12

Sì, ma funzionerà solo come previsto con i percorsi di accesso completi ai moduli:

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

Vale anche la pena ricordare che se il modulo examplemod importava CONSTANT direttamente nella sua tabella dei simboli con la sintassi 'from config import CONSTANT', dovresti fare' example.examplemod.CONSTANT = "Better value" ', poiché examplemod avrebbe quindi il proprio riferimento a COSTANTE. Il modulo che stai utilizzando sostituisce config.CONSTANT, che funziona nel caso in cui il modulo examplemod stia usando 'from examplemod import config; config.CONSTANT'. – Symmetric