python - 传播应用程序设置

标签 python singleton settings global

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

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

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

<强>1。明确的论点

数据库路径通过显式参数传递到任何需要的地方,并且数据库 session 使用该显式路径实例化。这可能是最模块化的,但似乎非常笨拙。

<强>2。数据库路径单例

数据库 session 对象看起来像:

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,除非我们使用工厂方法。此外,该方法可以执行诸如 session 缓存之类的操作。

还有其他我不知道的模式。我在网络框架中隐约看到了类似的东西,但我没有任何经验。我的示例非常具体,但我想它也会扩展到其他应用程序设置,因此是帖子的标题。

我想听听您对什么是最好的安排方式的想法。

最佳答案

是的,还有其他的。不过,您的选项 3 非常 Pythonic。

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

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

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

关于python - 传播应用程序设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735337/

相关文章:

python - 如何配置 Tkinter 滚动文本

python - 如何在 python-tornado 中捕获写入中止?

java - 在 Java 中使用双重检查锁定单例扩展类

objective-c - 单例模式实现

python - 无法强制脚本重试五次,除非中间出现 200 状态

python - 如何将图像转换为 URL Discord Py

C++单例实现,双重检查锁定

C#、SQL : Storing arbitrary user data in a database as serialized binary

java - IntelliJ Idea "entry point annotations"设置保存在哪里?

asp.net - 将 ASP.Net System.Net.Mail 设置移动到 Web.config