可能是一个非常常见的问题,但还是找不到合适的答案..
我有一个(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
,除非我们使用工厂方法。此外,该方法可以执行诸如会话缓存之类的东西。
然后还有其他模式,我不知道。我在网络框架中模糊地看到类似的东西,但我对这些没有任何经验。我的例子很具体,但我想它也扩展到其他应用程序设置,因此帖子的标题。
我想听听您对安排此事的最佳方式的看法。
答案 0 :(得分:2)
是的,还有其他人。你的选择3虽然非常Pythonic。
使用标准的Python模块封装选项(这是像Django这样的Web框架的方式)
使用工厂发出正确配置的会话。
由于SQLite已经有“连接”,为什么不使用它?您的DatabaseSession
类添加内置连接缺少什么?