Создайте пользовательское исключение при импорте - PullRequest
0 голосов
/ 27 февраля 2020

Короткий вопрос: у меня есть модуль с объектами. Как я могу это сделать, если кто-то импортирует объект из моего модуля, сгенерирует указанное мной исключение?

Что я хочу сделать: я пишу архитектурную среду (для работы как в Python 2, так и в 3). Класс для вывода зависит от jinja2 внешней библиотеки. Я хочу, чтобы фреймворк можно было использовать и без этой зависимости. В пакете __init__.py я пишу условный импорт моего класса RenderLaTeX (если jinja2 доступен, класс импортируется, в противном случае нет).

Проблема с этим подходом состоит в том, что у меня есть некоторый код, который использует этот класс RenderLaTeX, но когда я запускаю его на настройке fre sh, я получаю сообщение об ошибке типа Import error: no class RenderLaTeX could be imported from output. Эта ошибка довольно неожиданная и непонятная, прежде чем я вспоминаю, что jinja2 должен быть установлен заранее.

Я думал об этом решении: если класс недоступен, __init__.py может создать строку с этим именем. Если пользователь попытается создать экземпляр этого объекта с помощью обычного конструктора класса, он получит более значимую ошибку. К сожалению, простой импорт

from output import RenderLaTeX

не вызовет ошибку в этом случае.

Что бы вы предложили, надеюсь, с описанием преимуществ и недостатков?

1 Ответ

1 голос
/ 27 февраля 2020

Когда Python импортирует модуль, весь код внутри файла, из которого вы импортируете, выполняется.

Если ваш класс RenderLaTeX помещен в отдельный файл, вы можете свободно добавлять логи c, что помешало бы его импорту (или запуску) в случае отсутствия необходимых зависимостей.

Например:

try:
    import somethingidonthave
except ImportError:
    raise Exception('You need this module!')

class RenderLaTeX(object):
    pass

Вы также можете добавить любое пользовательское сообщение, к которому хотите добавить исключение лучше опиши ошибку. Это должно работать как в Python2, так и в Python3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...