2012-09-19 35 views
8

En mi aplicación estoy usando el módulo dentro del paquete example llamado examplemod.¿Cómo puedo anular una constante en un módulo Python importado?

Mi aplicación:

from example import examplemod 
examplemod.do_stuff() 

Importa otro módulo dentro example como tal.

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config utiliza una constante.

config.py:

CONSTANT = "Unfortunate value" 

me gustaría para anular esta constante cuando estoy usando examplemod en mi solicitud (poniéndolo a CONSTANT = "Better value") y yo preferiría no modificar el subyacente módulo así que no tengo que mantener mi propio paquete. ¿Cómo puedo hacer esto?

+0

Podría estar equivocado, pero creo que puede asignarle un valor a la variable una vez que se haya importado. – Borgleader

Respuesta

3

Gracias a todos por sus respuestas. Me apuntaron en la dirección correcta, aunque ninguno funcionó como estaba escrito. Terminé haciendo lo siguiente:

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

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

(Además, estoy enviando un parche para el mantenedor del módulo para hacer CONSTANTE una opción configurable por lo que no tengo que hacer esto, pero necesito para instalar el módulo de mientras tanto.)

1

no estoy seguro si esto es suficiente o no, pero no intenta:

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

Asegúrese de hacer esto antes examplemod es importado. Esto debería funcionar porque python almacena en caché las importaciones, por lo que el config que modificó será el mismo que obtiene examplemod.

1

Esto se llama monkey patching, y es bastante común aunque no preferido si hay otra manera de lograr lo mismo:

examplemod.config.CONSTANT = "Better value" 

El problema es que usted está confiando en la parte interna de examplemod y config restante del lo mismo, por lo que podría romperse si cualquiera de los módulos cambia.

12

Sí, pero sólo funcionará como se esperaba con vías de acceso totalmente calificado para módulos:

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

También vale la pena mencionar que si el módulo examplemod importó CONSTANT directamente en su tabla de símbolos con la sintaxis 'from config import CONSTANT', tendría que hacer' example.examplemod.CONSTANT = "Better value" ', ya que examplemod tendría entonces su propia referencia a CONSTANT. El formulario que está utilizando sustituye a config.CONSTANT, que funciona en el caso de que el módulo examplemod esté usando 'from examplemod import config; config.CONSTANT'. – Symmetric

Cuestiones relacionadas