2014-12-28 3 views
2

Я использую собственный модуль регистрации в моем проекте. Если он недоступен, я бы хотел заменить его манекеном, а не поднимать ImportError.Pythonic способ обработки ошибок импорта

Вот код, который в настоящее время делает это:

try: 
    import logger 
except ImportError: 
    print 'Couldn\'t load logger' 

    class DummyLogger(object): 
     def __init__(self): 
      pass 
     def log(self, image): 
      pass 

    logger = DummyLogger() 

Я не думаю, что это элегантное решение. Это работает, конечно, но это не приятно. Есть ли способ лучше?

+0

Почему он не может быть доступен? –

+0

@ArashSaidi, моя программа - это конвейер обработки изображений. Он принимает изображение, делает материал для него и сохраняет результаты. Отдельно у меня есть сценарий для обучения классификатору, который я использую внутренне. Этот скрипт должен выполнить некоторую предварительную обработку необработанных данных перед подачей их в классификатор. Подпроцессы предварительной обработки находятся в модуле, о котором я говорю. Этот модуль находится в подкаталоге основного проекта, поэтому, когда я запускаю основную программу, все работает нормально. Когда я запускаю обучение, модуль не видит регистратора, который находится на одном уровне выше в файловой системе. – Pastafarianist

ответ

0

Вы можете сделать это более кратким:

try: 
    import logger 
except ImportError: 
    print 'Couldn\'t load logger' 

    class logger(object): 
     @classmethod 
     def log(cls, image): 
      pass 

Обратите внимание, что даже в вашей текущей версии em pty __init__ следует удалить - это не добавляет никакой ценности.

+0

Спасибо, это именно то, что я искал. Вы также можете заменить '@ classmethod'' @ staticmethod', чтобы избавиться от этого аргумента 'cls'. – Pastafarianist

6

Я бы поставил фиктивную реализацию в отдельный модуль, называемый dummy_loggger, и пишут:

try: 
    import logger 
except ImportError: 
    import dummy_logger as logger 

я сделал это в прошлом с JSON парсеров:

try: 
    import ujson as json # very fast but might not be available in some cases 
except ImportError: 
    import json 
+0

Это было бы идеальным решением в более организованной среде, чем моя. К сожалению, для этого все еще требуется внешняя зависимость, поэтому она не на 100% пуленепробиваемая. Я поддерживаю ваш ответ, но принимаю @ AlexMartelli's. – Pastafarianist

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