Модель совместного использования между приложениями 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 и тогда остальная часть вашего приложения будет иметь доступ к результатам этого кода.

Другие вопросы по тегам