2011-02-02 12 views
5

Lo sé, lo sé, está sucio y todo. Quiero saber si es posible secuestrar el módulo __init__ de un módulo Python para reemplazarlo por el suyo.¿Cómo mono patch __init__ módulo en Python?

Lo estoy preguntando porque tengo que evitar que una django lib inicie una parte de su proceso init que hace que se bloquee con nuestra configuración.

Y sí, es mejor arreglar el django lib y enviar un parche. Sí, estoy en contacto con el autor sobre eso. Pero por ahora, necesito una solución rápida.

+4

¿Qué le parece simplemente editar el '__init __. Py' a su gusto? Todo es solo texto simple –

Respuesta

0

Puede simplemente editar el archivo __init__.py. No hay nada que te detenga y si lo haces bien no pasará nada malo.

+0

Estaba a punto de comentar que debería ser una respuesta. +1 –

+0

En caso de duda, ¡destrúyelo! – jathanism

+0

Solo me gustaría hacer una copia de seguridad de la existente y editarla. – XORcist

4

Una forma de secuestrar el procedimiento de importación es simular la importación en algún momento antes de que tenga lugar, en otro módulo que se importa antes que el que desea aplicar el parche de mono. Inserte lo que desee en sys.modules con el nombre del módulo como la clave, y cuando llegue el momento de importar el módulo original, Python encontrará una entrada en sys.modules y solo lo usará. Esto puede no funcionar si la importación se hace de alguna manera mágica.

Por otro lado, siempre puede simplemente copiar el proyecto original y aplicarle un parche a su gusto.

+0

+1 pero no pude hacerlo. No veo cómo reemplazarlo correctamente. Si configuro la entrada en el módulo dict, entonces no puedo importar los submódulos ohter porque mi versión no está en el mismo directorio. –

+0

Correcto, pensé que podría tener problemas con la importación de submódulos. En usted podría tratar de importar esos submódulos manualmente también, pero no estoy seguro de la mejor manera de hacerlo. Una última cosa que puede intentar es temporalmente parcheando cualquier función externa/global/etc. que el módulo en cuestión utiliza. Después de todo, si el módulo está haciendo algo relacionado con efectos secundarios, probablemente esté llamando a algunas funciones externas o modificando variables globales. Realice la reparación justo antes de la importación y restablezca los parches de mono inmediatamente después, y debería estar bien. –

Cuestiones relacionadas