2009-02-23 14 views
5

Tengo un módulo que importa un módulo, pero en algunos casos el módulo que se está importando puede no existir. Después de importar el módulo, hay una clase que hereda de una clase el módulo importado. Si tuviera que atrapar la excepción ImportError en el caso de que el módulo no exista, ¿cómo puedo evitar que Python analice el resto del módulo? Estoy abierto a otras soluciones si eso no es posible.¿Cómo salir de un módulo antes de que haya terminado de analizar?

Aquí es un ejemplo básico (selfaware.py):

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

class SelfAwareSkyNet(SkyNet): 
    pass 

La única manera que se me ocurre hacer esto es:

  • Antes de importar el módulo selfaware.py, comprobar si el módulo skynet está disponible, y simplemente pase o cree una clase de código auxiliar. Esto causará DRY si selfaware.py se importa varias veces.
  • Dentro de selfaware.py tienen la clase definida dentro del bloque try. ej .:

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

¿Qué pasa con su solución? ¿No funciona? ¿Recibe un error? –

+0

¿Hay un eco aquí? ¿Qué pasa con todas las respuestas duplicadas exactas? ¿Y por qué los dos duplicados más nuevos tienen puntajes más altos que los anteriores? –

+0

@MuMind Supongo que no noté que la respuesta de Hyperboreean fue editada después de que fuera inicialmente incorrecta. He vuelto a aceptar la respuesta. –

Respuesta

2

que puede usar:

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

class SelfAwareSkyeNet(inherit_from): 
    pass 

Esto funciona sólo si la aplicación no se diferencian.

Editar: Nueva solución después del comentario.

8

intento: admite una cosa: la cláusula

try: 
    from skynet import SkyNet 

except ImportError: 
    class SelfAwareSkyNet(): 
     pass 

else: 
    class SelfAwareSkyNet(SkyNet): 
     pass 
Cuestiones relacionadas