我有一个应用程序,它包含一个引入多个模块的基础应用程序。基础应用程序将参数文件读入配置哈希,我希望在所有模块中共享它。
目前,我正在将“父”对象传递给模块,然后这些模块正在执行self.parent.config之类的操作来获取配置。
然而,由于模块层次结构有几个层次,我发现自己做的事情就像self.parent.parent.config,它开始看起来很糟糕。
在整个应用程序及其模块中共享配置对象有哪些更好的模式?我正在考虑有一个'config'模块,它基本上创建一个全局配置变量,可以由基础应用程序设置,然后由其他模块导入和访问,但我不确定是否使用像这样的全局变量对其他的原因。
我是Python的新手,所以要好看=)
答案 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)