2012-01-16 11 views
7

Ésta es mi estructura de archivos:Importación de un módulo opcional

[mylibrary] 
    __init__.py 

    [codecs] 
     __init__.py < this is the file that we're talking about 
     optional.py 

Ahora tengo este código en el marcado __init__.py:

def load_optional_codecs(): 
    try: 
     from mylibrary.codecs import optional 
     # do stuff with optional 
    except ImportError: 
     pass 

Hay un problema con esto. Si el módulo optional contiene una excepción de importación en sí, fallará en silencio. ¿Hay alguna forma de importar un módulo opcional sin silenciar ninguna excepción del módulo?


Esto puede parecer un escenario oscuro, pero he conseguido un error desagradable debido a la excepción silenciado y me gustaría evitar que esto ocurra en el futuro.

+0

Puede informar la excepción al usuario o registrarla en lugar de 'pass' en el bloque' except', pero si el error de importación presenta errores desagradables, diría que es casi seguro que no es "opcional". – geoffspear

+0

@Wooble: no, el 'from mylibrary.codecs import optional' no falló. El problema fue que el módulo 'opcional 'importó un módulo que falló (debido a un error de programación), pero ese error se silenció. – orlp

Respuesta

7

Esto es un poco hacky, pero se puede comprobar el mensaje de excepción para determinar qué falló:

try: 
    from mylibrary.codecs import optional 
except ImportError, e: 
    if e.message != 'No module named optional': 
     raise 

Con este código, si importar el módulo opcional falla, se ignora, pero si todo lo demás genera una excepción (importación de otro módulo, errores de sintaxis, etc.), se generará.

+0

oh hah, eso es bastante ingenioso. Si no aparecen alternativas, creo que usaré esto. – orlp

+0

Habría una alternativa si los diseñadores de idiomas hubieran agregado un atributo e. gramo. 'module' a' ImportError'. Pero no lo hicieron, así que esta parece ser la forma más factible. – glglgl

+3

@glglgl 'ParsingError ('Etiqueta inicial de no encontrada')' – PascalVKooten

Cuestiones relacionadas