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

时间:2011-04-19 01:54:39

标签: python design-patterns configuration

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

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

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

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

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

4 个答案:

答案 0 :(得分:14)

你可以:

import config

并拥有全局配置模块


摘自我的评论:

您只需说出oddValue if isOddSituation() else config.normalValue即可为奇数情况添加特殊规则。

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

import config as baseConfig
config = dict(baseConfig, overriddenValue=etc)

你所在的范围并不重要。

答案 1 :(得分:3)

回答旧问题:

按照@Reed Copsey here的建议使用依赖注入。 E.g。

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)

答案 2 :(得分:0)

我认为通过'模块',你实际上指的是'类/对象'。对象是类的实例,例如:

class MyClass(object):
    def __init__(self, ...):
        ...
    ...

myObject = MyClass()

模块是您导入的.py文件,如下所示:

import mymodule

您实例化的所有类似乎都不太可能要访问全局配置。但是,如果您确实需要应用程序中的所有内容来访问某些全局参数,则可以将它们放在您自己的config模块中:

myParam1 = 1
myParam2 = 2

然后从任何模块或任何对象或任何地方真实地,只要你import config,你可以说print(config.myParam1)

或者,如果您希望大型对象层次结构共享对同一属性的访问权限,则无需通过手动设置self.parent来引用它。只要使用继承,就可以执行以下操作:

class Parent(object):
    def __init__(self, theConfig):
        self.theConfig = theConfig

class Child(Parent):
    ...
    def method(self,...):
        print(self.theConfig)

答案 3 :(得分:0)