0

異なるElixir / SQLAlchemyアプリケーション間でデータ モデルを共有したいと考えています。そのうちの 1 つはCamelot UI であり、他のアプリケーションは Web インターフェイスなどです。それらはすべて、同じ基礎となるデータベースに接続します。

私の知る限り、私のモデルで 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行うのですが、インポートを基になるモジュールにどのように渡すのでしょうか?

4

1 に答える 1

0

それが良いアイデアかどうかはわかりませんが、モジュールは Java のイディオムでは「シングルトン」であり、状態を共有するため、インポートを中心にするのは簡単です。つまり、次のことができます。

dataProxy.py

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

そして、別のモジュールで

from dataProxy import Integer

どこでも同じクラスを取得できます (つまり、同じインタープリター セッションで)。このイディオムは、構成ファイルによく使用されます。たとえば、セットアップ コードを に記述してsettings.py、アプリの残りの部分がそのコードの結果にアクセスできるためです。

于 2010-10-14T15:20:56.773 に答える