2012-01-16 4 views
7

Это моя структура файла:Импорт дополнительного модуля

[mylibrary] 
    __init__.py 

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

Теперь у меня есть этот код в маркированной __init__.py:

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

Существует одна проблема с этим. Если модуль optional содержит исключительное исключение импорта, он будет терпеть неудачу. Есть ли способ импортировать дополнительный модуль без отключения каких-либо исключений из модуля?


Это может показаться неясным сценарий, но я получил неприятную ошибку из-за глушителем исключения, и я хотел бы, чтобы не допустить этого в будущем.

+0

Вы можете сообщать об исключении пользователю или записывать его в лог вместо 'pass' в блоке' except', но если в результате неудачи импорта появляются неприятные ошибки, я бы сказал, что это почти наверняка не «необязательно». – geoffspear

+0

@Wooble: нет, 'from mylibrary.codecs import optional' не подвел. Проблема заключалась в том, что модуль 'optional' импортировал модуль, который потерпел неудачу (из-за ошибки программирования), но эта ошибка отключилась. – orlp

ответ

7

Это немного Hacky, но вы можете проверить сообщение о чрезвычайном для определения того, что не удалось:

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

С помощью этого кода, если импортировать дополнительный модуль выходит из строя, оно игнорируется, но если что-нибудь еще вызывает исключение (импорт другого модуля, ошибки синтаксиса и т. д.), он будет поднят.

+0

О, ха, это довольно изящно. Если альтернативы не появятся, я думаю, что я буду использовать это. – orlp

+0

Было бы альтернативой, если бы разработчики языка добавили атрибут e. г. 'module' в' ImportError'. Но они этого не сделали, поэтому этот способ представляется наиболее осуществимым. – glglgl

+3

@glglgl 'ParsingError ('Начальный тэг не найден')' – PascalVKooten

Смежные вопросы