实现类似Django的文件配置
在Django项目中,有两个关于配置的文件,一个是用户自定义的配置文件settings.py,一个是系统默认的配置文件global_settings.py,此外还有一个是能够获取以上两个配置文件信息的settings对象
上述实现的效果是:用户自定义的配置优先级高于系统默认的(用户配置使用用户的,没有配置使用默认的),而conf下的__init__.py则拥有一个settings对象,用于获取...
代码实现1
from MySettings.lib.conf import setting if __name__ == '__main__': # 获取配置文件的DEBUG设置 print(setting.DEBUG)
# 用户自定义文件 DEBUG = True
# 系统默认配置文件 DEBUG = False
from MySettings.conf import settings from MySettings.lib.conf import global_settings class LazySettings: def __init__(self): self.__setattr(global_settings) self.__setattr(settings) def __setattr(self, conf): res = dir(conf) for key in res: if key.isupper(): setattr(self, key, getattr(conf, key)) # 对不存在的属性访问,做点号拦截,增强程序健壮性 def __getattr__(self, item): return "没有该项配置" setting = LazySettings()
代码实现2
# 上面对于用户配置文件的导入是使用模块导入的方法,我们改用环境变量
import os # 注意添加环境变量要在导入模块之前 os.environ["settings"] = "MySettings.conf.settings" from MySettings.lib.conf import settings if __name__ == '__main__': print(settings.DEBUG)
import os from MySettings.lib.conf import global_settings import importlib class LazySettings: def __init__(self): self.__setattr(global_settings) res = os.environ.get("settings") settings = importlib.import_module(res) self.__setattr(settings) def __setattr(self, conf): res = dir(conf) for key in res: if key.isupper(): setattr(self, key, getattr(conf, key)) def __getattr__(self, item): return "没有该项配置" settings = LazySettings()

浙公网安备 33010602011771号