Модель совместного использования между приложениями Camelot и не-Camelot
Я хотел бы поделиться своей моделью данных между различными приложениями Elixir/ SQLAlchemy, одним из которых будет пользовательский интерфейс Camelot, а другим - веб-интерфейсы и так далее. Все они будут подключаться к одной и той же базе данных.
Насколько я знаю, для создания приложения Camelot моя модель будет делать from camelot import blah
и это помешало бы его запуску в любой среде без установленного Camelot.
Я хотел бы знать, есть ли рекомендуемый способ / наилучшая практика для этого. Идея, конечно, состоит в том, чтобы поддерживать единую кодовую базу для моей модели, а не копировать ее с небольшими различиями между различными приложениями (например, импорт из SA/Elixir здесь, из Camelot и т. Д.).
Мой проект в настоящее время разрабатывается с пакетом модель / Python:
model/__init__.py
foo.py
bar.py
...
init.py выглядит так:
from foo import a, b, c
from bar import d, e, f
__all__ = ('a', 'b', 'c', 'd', 'e', 'f')
и модули Python foo.py, bar.py и т. д. фактически реализуют различные части. Каждый из этих модулей начинается так:
from sqlalchemy import Integer, Numeric, Date, Unicode, LargeBinary
from elixir import Entity, Field, ManyToOne, OneToMany, ManyToMany
from elixir import using_options
Идея может быть сделать что-то вроде:
try:
from camelot import Integer, Numeric, ...
except ImportError:
from elixir import Integer, Numeric, ...
это на самом деле хорошая идея, или я что-то упускаю? Кроме того, в идеале я бы делал такие вещи "инициализации среды" в каком-то центральном месте, как в model/__init__.py
, но как мне передать мой импорт в базовые модули?
1 ответ
Я не могу говорить о том, будет ли это хорошей идеей, но легко сделать импорт центральным, потому что модули являются "одиночками" в идиоме Java: они разделяют состояние. Другими словами, вы можете сделать следующее:
dataProxy.py
try:
from camelot import Integer, Numeric, ...
except ImportError:
from elixir import Integer, Numeric, ...
а затем в другом модуле сделать
from dataProxy import Integer
и вы получите одни и те же классы везде (в том же сеансе интерпретатора, то есть). Эта идиома часто используется для файлов конфигурации, потому что вы можете написать, например, код установки в settings.py
и тогда остальная часть вашего приложения будет иметь доступ к результатам этого кода.