我有一个我想在其他模块中访问的类实例。此类使用configParser加载配置值,以根据post更新类实例__dict__
:
我想在其他模块中访问此实例。该实例仅在main.py
文件中创建,它可以通过命令行参数访问所需的参数。
我有三个文件:main.py
,config.py
和file.py
。我不知道在file.py
中访问该实例的最佳方式。我只能访问main.py
而不是其他模块。
我已经查看了以下答案here和here,但他们并没有完全回答我的情况。
#config.py
class Configuration():
def __init__(self, *import_sections):
#use configParser, get config for relevant sections, update self.__dict__
#main.py
from config import Configuration
conf = Configuration('general', 'dev')
# other lines of code use conf instance ... e.g. config.log_path in log setup
#file.py
#I want to use config instance like this:
class File():
def __init__(self, conf.feed_path):
# other code here...
考虑的选项:
在config.py模块中初始化配置
在config.py
课后定义中我可以添加:
conf = Configuration('general', 'dev')
以及file.py
和main.py
:
from config import conf
但general
和dev
变量只能在main.py
中找到,所以看起来不会起作用。
使配置类成为一种功能
我可以将它作为一个函数并创建一个模块级字典并将数据导入其他模块:
#config.py
conf = {}
def set_config(*import_section):
# use configParser, update conf dictionary
conf.update(...)
这意味着将其称为config.conf['log_path']
。因为它被多次使用,我更喜欢conf.log_path
。
通过其他实例
我可以通过main.py
中的其他类实例将conf实例作为参数传递,即使中间实例不使用它也是如此。看起来很乱。
其他选项?
我可以以某种方式将配置用作实例吗?
答案 0 :(得分:2)
通过将Configuration
课程更改为Borg
,您可以保证从任何地方获得共同状态。您可以通过特定的__init__
提供初始化:
#config.py
class Configuration:
__shared_state = {}
def __init__(self, *import_sections):
self.__dict__ = self.__shared_state
if not import_sections: # we are not initializing this time
return
#your old code verbatim
初始化与c = config.Configuration('general','dev')
照常进行,对conf = config.Configuration()
的任何调用都会获得c
创建的状态。
或者您可以提供初始化方法以避免篡改__init__
中的共享状态:
#config.py
class Configuration:
__shared_state = {}
def __init__(self):
self.__dict__ = self.__shared_state
def import(self, *import_sections):
#your old __init__
这样,__init__
方法只有一个含义,它更清晰。
在这两种情况下,您都可以使用config.Configuration()
从代码中的任何位置获取共享状态。