2010-10-13 30 views
8

¿Es posible sobrecargar la instrucción from/import en Python?¿Es posible sobrecargar/importar en Python?

Por ejemplo, suponiendo jvm_object es una instancia de la clase JVM, es posible escribir este código:

class JVM(object): 

    def import_func(self, cls): 
    return something... 

jvm = JVM() 

# would invoke JVM.import_func 
from jvm import Foo 
+3

¿Por qué? ¿Alguna vez harías esto? –

+0

@ S. Lott En esencia, quiero importar paquetes y las clases de una JVM remota (en un programa de Python) y aunque podría proporcionar un método de importación, me gustaría volver a utilizar la sintaxis de Python. – Barthelemy

+0

"importar paquetes y clases desde una JVM remota"? ¿No es un archivo? ¿Cómo va a funcionar eso? ¿Cómo gestionará la creación de archivos .pyc? ¿Qué pasa con los "archivos"? Ellos trabajan realmente bien. ¿Qué pasa con el montaje remoto de un sistema de archivos? Eso funciona realmente bien. –

Respuesta

7

This post muestra cómo utilizar la funcionalidad introducida en PEP-302 importar módulos a través de la web. Lo publico como un ejemplo de cómo personalizar la declaración de importación en lugar de como uso sugerido;)

+0

¡Gracias, funciona bien! – Barthelemy

3

Es difícil encontrar algo que no es posible en un lenguaje dinámico como Python, pero ¿realmente tenemos que abusar de todo? De todos modos, aquí está:

from types import ModuleType 
import sys 

class JVM(ModuleType): 
    Foo = 3 

sys.modules['JVM'] = JVM 

from JVM import Foo 
print Foo 

Pero un patrón que he visto en varias bibliotecas/proyectos es una especie de función _make_module(), que crea un ModuleType forma dinámica e inicializa todo en él. Después de eso, el Módulo actual se reemplaza por el nuevo módulo (usando la asignación a sys.modules) y la función _make_module() se elimina. La ventaja de esto es que puede recorrer el módulo e incluso agregar objetos al módulo dentro de ese bucle, lo que a veces es bastante útil (¡pero úselo con precaución!).

Cuestiones relacionadas