2010-10-13 3 views
8

È possibile sovraccaricare l'istruzione from/import in Python?È possibile sovraccaricare/importare in Python?

Ad esempio, supponendo jvm_object è un'istanza di classe JVM, è possibile scrivere questo codice:

class JVM(object): 

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

jvm = JVM() 

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

Perché? lo faresti mai? –

+0

@ S.Lott In sostanza, voglio importare pacchetti e classi da una JVM remota (in un programma Python) e sebbene possa fornire un metodo di importazione, vorrei riutilizzare la sintassi di Python. – Barthelemy

+0

"importa pacchetti e classi da una JVM remota"? Non un file? Come andrà a lavorare? Come gestirai la creazione di file .pyc? Cosa c'è di sbagliato con "file"? Funzionano davvero bene. Cosa c'è di sbagliato con il montaggio remoto di un file system? Funziona davvero bene. –

risposta

7

This post illustra come utilizzare funzionalità introdotte in PEP-302 importare moduli via web. Inserisco un esempio di come personalizzare la dichiarazione di importazione piuttosto che come uso suggerito;)

+0

Grazie, funziona bene! – Barthelemy

3

È difficile trovare qualcosa che non sia possibile in un linguaggio dinamico come Python, ma abbiamo davvero bisogno di abusare di tutto? In ogni caso, qui è:

from types import ModuleType 
import sys 

class JVM(ModuleType): 
    Foo = 3 

sys.modules['JVM'] = JVM 

from JVM import Foo 
print Foo 

Ma un modello che ho visto in diverse biblioteche/progetti è una sorta di una funzione _make_module(), che crea un ModuleType in modo dinamico e inizializza tutto ciò che contiene. Successivamente, il modulo corrente viene sostituito dal nuovo modulo (utilizzando l'assegnazione a sys.modules) e la funzione _make_module() viene eliminata. Il vantaggio è che puoi eseguire il looping del modulo e persino aggiungere oggetti al modulo all'interno di quel ciclo, il che è abbastanza utile a volte (ma usalo con cautela!).