用于在整个应用程序中共享配置的Python模式

| 我有一个包含基本应用程序的应用程序,其中包含几个模块。基本应用程序将参数文件读入配置哈希,我想在所有模块之间共享它。 目前,我正在将\'parent \'对象传递给模块,然后这些模块正在执行诸如self.parent.config之类的操作来获取配置。 但是,由于模块层次结构有多个级别,因此我发现自己正在执行诸如self.parent.parent.config之类的事情,这种情况似乎开始变得不好。 在应用程序及其模块之间共享配置对象有哪些更好的模式?我正在考虑使用一个\'config \'模块,该模块基本上创建一个全局配置变量,该变量可以由基本应用程序设置,然后由其他模块导入和访问,但是我不确定是否使用像这样的全局变量是一种不好的做法由于其他原因。 我是Python的新手,所以很好=)
已邀请:
您可以:
import config
并有一个全局配置模块 我的评论摘录: 您总是可以为奇怪的情况添加特殊规则,只需说“ѭ1”即可。 如果您希望配置模块可以按层次结构划分为子类(如我的其他答案所述),则可以将配置表示为类,或者可以使用
copy
模块进行浅表复制和修改,也可以使用\ “配置字典\”,例如:
import config as baseConfig
config = dict(baseConfig, overriddenValue=etc)
您所处的范围并不重要。
回答旧问题: 只需使用@Reed Copsey建议的依赖项注入即可。例如。
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)
我认为通过“模块”,您实际上是在指“类/对象”。对象是类的实例,例如:
class MyClass(object):
    def __init__(self, ...):
        ...
    ...

myObject = MyClass()
模块是您导入的.py文件,如下所示:
import mymodule
您实例化的所有类似乎不太可能希望访问全局配置。但是,如果您确实需要应用程序中的所有内容才能访问某些全局参数,则可以将它们放在自己的
config
模块中:
myParam1 = 1
myParam2 = 2
然后从任何模块或任何对象或任何地方开始,只要您执行了
import config
,您就可以说
print(config.myParam1)
另外,如果您希望对象的较大层次结构都共享对同一属性的访问权限,则无需通过手动设置ѭ11来引用它。只要使用继承,就可以执行以下操作:
class Parent(object):
    def __init__(self, theConfig):
        self.theConfig = theConfig

class Child(Parent):
    ...
    def method(self,...):
        print(self.theConfig)
看看这个。它可以帮助您: https://gist.github.com/dgarana/c052a3287629dd7c0b0c9d7921081e9d

要回复问题请先登录注册