传播应用程序设置

时间:2009-04-09 18:17:18

标签: python singleton settings global

可能是一个非常常见的问题,但还是找不到合适的答案..

我有一个(Python w / C ++模块)应用程序,它大量使用SQLite数据库,其路径由用户在应用程序启动时提供。

每次应用程序的某些部分需要访问数据库时,我计划获取一个新会话并在完成后将其丢弃。为此,我显然需要访问启动时提供的路径。我看到它发生的几种方式:

1。明确的论点

数据库路径通过显式参数传递到需要的任何位置,并使用该显式路径实例化数据库会话。这可能是最模块化的,但似乎令人难以置信的尴尬。

2。数据库路径单例

数据库会话对象如下所示:

import foo.options
class DatabaseSession(object):
    def __init__(self, path=foo.options.db_path):
        ...

我认为这是一个较小的邪恶单身,因为我们只存储常量字符串,这些字符串在应用程序运行时不会改变。这样就可以覆盖默认情况,并在必要时对DatabaseSession类进行单元测试。

第3。数据库路径单例+静态工厂方法

对上述情况可能略有改善:

def make_session(path=None):
    import foo.options
    if path is None:
        path = foo.options.db_path
    return DatabaseSession(path)

class DatabaseSession(object):
    def __init__(self, path):
        ...

这样,模块完全不依赖foo.options,除非我们使用工厂方法。此外,该方法可以执行诸如会话缓存之类的东西。

然后还有其他模式,我不知道。我在网络框架中模糊地看到类似的东西,但我对这些没有任何经验。我的例子很具体,但我想它也扩展到其他应用程序设置,因此帖子的标题。

我想听听您对安排此事的最佳方式的看法。

1 个答案:

答案 0 :(得分:2)

是的,还有其他人。你的选择3虽然非常Pythonic。

使用标准的Python模块封装选项(这是像Django这样的Web框架的方式)

使用工厂发出正确配置的会话。

由于SQLite已经有“连接”,为什么不使用它?您的DatabaseSession类添加内置连接缺少什么?