用于在整个应用程序中共享配置

aaa*_*210 21 python configuration design-patterns

我有一个应用程序,它包含一个基础应用程序,可以引入多个模块.基础应用程序将参数文件读入配置哈希,我想在所有模块中共享它.

目前,我将"父"对象传递给模块,然后这些模块正在执行self.parent.config之类的操作来获取配置.

但是,由于模块层次结构有几个层次,我发现自己做的事情就像self.parent.parent.config,它开始看起来很糟糕.

在应用程序及其模块中共享配置对象有哪些更好的模式?我正在考虑有一个'config'模块,它基本上创建一个全局配置变量,可以由基础应用程序设置,然后由其他模块导入和访问,但我不确定是否使用像这样的全局变量对其他原因.

我是Python的新手,所以很好=)

nin*_*cko 15

你可以:

import config
Run Code Online (Sandbox Code Playgroud)

并有一个全局配置模块


摘自我的评论:

您可以随时为奇怪的情况添加特殊规则oddValue if isOddSituation() else config.normalValue.

如果您希望配置模块具有分层可子类化(如我的其他答案所述),那么您可以将配置表示为类,或者您可以使用该copy模块并进行浅层复制并对其进行修改,或者您可以使用"配置"字典",例如:

import config as baseConfig
config = dict(baseConfig, overriddenValue=etc)
Run Code Online (Sandbox Code Playgroud)

你所在的范围并不重要.

  • +1:模块是单例,所以这非常非常好. (3认同)
  • 这让我很困扰,因为我不太喜欢单身人士。我认为这里需要更详细一点。我希望看到一种机制,可以轻松地将配置“推送”到堆栈或类似的东西上,这样您就可以轻松地替换配置或针对奇怪的情况提出特殊的解析规则。 (2认同)

Bas*_*ani 8

回答老问题:

只需按照@Reed Copsey here 的建议使用依赖项注入。例如

class MyClass:
    def __init__(myConfig):
        self.myConfig = myConfig
        ...

    def foo():
        self.myConfig.getConfig(key)
        ...
        self.myConfig.setConfig(key,val)
        ...

...
# myConfig is your configuration management Module/Class
obj = SomeClass(myConfig)
Run Code Online (Sandbox Code Playgroud)