Relrin
@Relrin

Используются ли все зависимые библиотеки при импорте в Python?

Сейчас пишу собственную библиотеку для Python'а, которая будет иметь совместимость с Django/SQLAlchemy ORM. На текущий момент структура внутри библиотеки/пакета такая:

MyProject
  |-- db
    |-- orm
      |-- django 
      |-- sqlalchemy


Соответственно, в sqlaclhemy каталоге описаны реализованы какие-то *.py файлы, обеспечивающие совместимость с SQLAlchemy ORM, а django – реализация для Django ORM. Вопрос следующий: если программист поставил себе только этот пакет + Django, не возникнет ли у него ImportError, когда осуществляет работу только с джанговским ORMом, не выполняя явного импорта чего-либо для SQLAlchemy (если будет явный вызов для этого ORM – тут понятно, ошибка возникнет)? Если все же возникнет, то как ее можно избежать?
Быть может кто-нибудь может подсказать так называемые "best practice", чтобы сделать что-то лучше в этом плане?
  • Вопрос задан
  • 315 просмотров
Решения вопроса 1
@nirvimel
В Python импорт полностью динамический и происходит в runtime. Можно написать:
if moon_phase == 42:
      import sqlalchemy

Тогда ImportError будет вылетать при определенной фазе луны.
Зависимости пакетов в setuptools к этому отношения не имеют.

Что касается best practice, то абстракция от ORM или любого другого уровня часто реализуется так:
  • Общий функционал, не зависящий от реализации, выносится в ядро, которое оформляется отдельным пакетом mylibrary_core.
  • Связи с конкретной реализацией оформляются в виде плагинов в отдельных пакетах (mylibrary_django, например).
  • Каждый такой плагин имеет зависимость к ядру и к конкретной реализации (django, например).
  • Конечный юзер начинает установку сразу с mylibrary_django, который автоматом подтягивает mylibrary_core, о котором юзеру беспокоится не приходится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
is_user_install_anything_useful = False

try:
    import django
    is_user_install_anything_useful = True
except ImportError:
    pass

try:
    import sqlalchemy
    is_user_install_anything_useful = True
except ImportError:
    pass

if not is_user_import_anything_useful: 
     raise ImportError('Install django or SQLalchemy')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы