代码之家  ›  专栏  ›  技术社区  ›  Luke404

camelot和非camelot应用程序之间的共享模型

  •  0
  • Luke404  · 技术社区  · 14 年前

    我想在不同的 Elixir / SQLAlchemy 应用程序,其中一个是 Camelot 用户界面和其他东西,比如Web界面等等。它们都将连接到同一个基础数据库。

    据我所知,要构建一个camelot应用程序,我的模型可以做到 from camelot import blah 这将阻止它在任何没有安装camelot的环境中运行。

    我想知道是否有推荐的方法/最佳实践可以做到这一点。当然,我的想法是为我的模型维护一个单一的代码库,而不是在不同的应用程序之间使用细微的差异来复制它(比如从sa/elixir导入,从camelot导入,等等)。

    我的项目目前使用的是一个模型/python包:

    model/__init__.py
          foo.py
          bar.py
          ...
    

    初始化 .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 回复  |  直到 9 年前
        1
  •  0
  •   Katriel    14 年前

    我不能说这是否是个好主意,但是很容易使导入成为中心,因为模块是Java习语中的“单独”:它们共享状态。换句话说,您可以执行以下操作:

    DATA PROXXY

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

    然后在另一个模块中做

    from dataProxy import Integer
    

    你将在任何地方得到相同的类(在同一个解释器会话中,也就是说)。这个习惯用法通常用于配置文件,因为您可以在 settings.py 然后你的应用程序的其余部分将可以访问该代码的结果。