2009-02-23 8 views
5

Ho un modulo che importa un modulo, ma in alcuni casi il modulo che si sta importando potrebbe non esistere. Dopo che il modulo è stato importato, una classe eredita da una classe il modulo importato. Se dovessi rilevare l'eccezione ImportError nel caso in cui il modulo non esista, come posso impedire a Python di analizzare il resto del modulo? Sono aperto ad altre soluzioni se questo non è possibile.Come uscire da un modulo prima di aver terminato l'analisi?

Ecco un esempio di base (selfaware.py):

try: 
    from skynet import SkyNet 
except ImportError: 
    class SelfAwareSkyNet(): 
     pass 
    exit_module_parsing_here() 

class SelfAwareSkyNet(SkyNet): 
    pass 

Gli unici modi che posso pensare di farlo è:

  • Prima di importare il modulo selfaware.py, controllare se il modulo skynet è disponibile e semplicemente passa o crea una classe stub. Ciò causerà DRY se selfaware.py viene importato più volte.
  • All'interno della classe selfaware.py è definita la classe con il blocco try. es .:

    try: 
        from skynet import SkyNet 
        class SelfAwareSkyNet(SkyNet): 
         pass 
    except ImportError: 
        class SelfAwareSkyNet(): 
         pass 
    
+0

Cosa c'è di sbagliato con la soluzione? Non funziona? Riceve un errore? –

+0

C'è un eco qui? Cos'è con tutte le risposte duplicate esatte? E perché entrambi i duplicati più recenti hanno punteggi più alti dei vecchi? –

+0

@MuMind Immagino di non aver notato che la risposta di hyperboreean è stata modificata dopo che inizialmente era errata. Ho riattivato la risposta. –

risposta

2

si potrebbe usare:

try: 
    from skynet import SkyNet 
    inherit_from = SkyNet 
except ImportError: 
    inherit_from = object 

class SelfAwareSkyeNet(inherit_from): 
    pass 

Questo funziona solo se l'attuazione non differiscono.

Modifica: Nuova soluzione dopo il commento.

8

prova: supporta un altro: clausola di

try: 
    from skynet import SkyNet 

except ImportError: 
    class SelfAwareSkyNet(): 
     pass 

else: 
    class SelfAwareSkyNet(SkyNet): 
     pass 
Problemi correlati