2012-05-31 11 views
17

Tengo un problema al reemplazar el método desde donde ... se utiliza la declaración de importación. Algunos ejemplo para ilustrar el problema:Sobrescribir el método del módulo desde el que se utiliza ... importar

# a.py module 
def print_message(msg): 
    print(msg) 

# b.py module 
from a import print_message 
def execute(): 
    print_message("Hello") 

# c.py module which will be executed 
import b 
b.execute() 

me gustaría método print_message (msg) anular sin cambiar el código en un módulo o b. Lo intenté de muchas maneras, pero desde ... importa el método original de importación. Cuando cambié el código a

import a 
a.print_message 

que veo mi cambio.

¿Podría sugerirme cómo puedo solucionar este problema?
Gracias de antemano por cualquier pequeño ejemplo.

Saludos

------------------ ------------------ actualización
I intentado hacer eso como a continuación, por ejemplo:

# c.py module 
import b 
import a 
import sys 
def new_print_message(msg): 
    print("New content") 
module = sys.modules["a"] 
module.print_message = new_print_message 
sys.module["a"] = module 

Pero esto no funciona donde estoy usando para ... importación. Está trabajando solo para la importación, pero como escribí, no quiero cambiar el código en los módulos b.py y a.py.

+0

(1) ¿Qué quiere decir con "anular"? Parche de mono? (2) En el código que presenta, solo hay un 'print_message()'. – NPE

+0

Quiero cambiar el método print_message() para imprimir, p. Mensaje "Nuevo contenido". ¿Cómo lograr eso desde el archivo c.py sin cambios en a.py y b.py? – Pawel

+0

para explicación y demostración de "parche de mono": http://stackoverflow.com/a/6647776/1498405 – hardmooth

Respuesta

29

Con sus a y b módulos vírgenes que podría intentar implementar c de la siguiente manera:

import a 

def _new_print_message(message): 
    print "NEW:", message 

a.print_message = _new_print_message 

import b 
b.execute() 

Tienes que la primera importación a, a continuación, reemplace la función y luego importar b por lo que utilizaría el módulo a que ya está importado (y cambiado).

+1

Su código está funcionando. Mi error fue que puse la sentencia import b antes de anular el método print_message. Con la importación b después de que un código .print_message = _new_print_message esté funcionando. Gracias por la ayuda. – Pawel

+0

PEP-8 recomienda colocar todas las instrucciones de importación en la parte superior del módulo. Es lo mismo que tener una instrucción include en medio de un archivo .cpp; acabarás en un mundo de dolor. – Steztric

Cuestiones relacionadas