Модель совместного использования между приложениями Camelot и не-Camelot - PullRequest
0 голосов
/ 14 октября 2010

Я хотел бы поделиться своей моделью данных между различными 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 Ответ

0 голосов
/ 14 октября 2010

Я не могу говорить о том, будет ли это хорошей идеей, но легко сделать импорт центральным, потому что модули являются «одиночками» в идиоме Java: они разделяют состояние.Другими словами, вы можете сделать следующее:

dataProxy.py

try:
    from camelot import Integer, Numeric, ...
except ImportError:
    from elixir import Integer, Numeric, ...

и затем в другом модуле сделать

from dataProxy import Integer

, и вы получите то жеклассы везде (в том же сеансе интерпретатора, то есть).Эта идиома часто используется для файлов конфигурации, потому что вы можете написать, например, код установки в settings.py, и тогда у остальной части вашего приложения будет доступ к результатам этого кода.

...