python – 传播应用程序设置

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

我有一个(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.另外,该方法可以执行诸如会话缓存之类的东西.

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

我想听听你对如何安排这个问题的最佳方法的看法.

最佳答案 是的,还有其他人.你的选择3虽然非常Pythonic.

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

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

既然SQLite已经有了“连接”,为什么不使用它呢?您的DatabaseSession类添加了内置连接缺少的内容?

点赞