当前位置: 首页 > 科技观察

优雅加载Yaml配置文件

时间:2023-03-16 01:30:35 科技观察

我在很多文章里都说过,我很喜欢用Yaml格式来写配置文件。Yaml是一种非常友好的配置格式。有时候,我们在开发环境、测试环境、线上环境中都有多套不同的配置文件。如何在不修改代码的情况下方便的切换配置文件?我以前的一篇文章描述了一种使用环境变量来指定配置文件名的方法。今天我们将介绍一个更高级的工具,旨在高效地加载配置文件。这是Hydra,由Facebook开源。这个工具有多简单?我们先写两个配置文件,然后看如何读取:使用pip安装Hydra:python3-mpipinstallhydra-core接下来我们写一段代码来读取配置文件:importosimporthydrafromomegaconfimportDictConfigenv=os.getenv('DATA_CENTER','dev')@hydra.main(config_path="config",config_name=env)defmain(cfg:DictConfig):print('MongoDB链接地址为:',cfg.mongo.uri)print('Redis的key是:',cfg.redis.key)print('黑名单是:',cfg.detail.black_list)if__name__=='__main__':main()运行效果如图下图:其中装饰器hydra.main的参数config_path指定了配置文件存放的文件夹,config_name用于指定配置文件的名称(去掉.yaml)。这样,我们可以通过环境变量指定要使用的配置文件。这好像和我之前讲的方法没什么区别。好吧,高级功能来了。比如我现在使用dev环境,想临时修改Redis的key怎么办?在之前的方法中,我必须修改Yaml文件并更改Key。不过既然是临时修改,测试完再改回去显然很麻烦。使用Hydra,这个问题不再是问题。我们先看一下直接在命令中覆盖数据的方法:请看图,我没有对代码做任何修改,也没有对Yaml做任何修改。只需要在启动命令的时候加上一个参数redis.key=new_key,程序就会读取新的值。这对于临时测试非常有用。除了我上面介绍的,Hydra还可以实现自动补全、自动提示参数名、自动连续运行多个不同的配置等等。最后,我补充一点。公众号粉丝群里有同学问为什么Hydra在调用函数的时候不能传额外参数。比如你这样写,就会报错:这是因为Hydra的装饰对象应该是程序的入口函数。将参数传递给入口函数很奇怪。如果你的入口函数需要根据参数的不同取值执行不同的逻辑,那么你可以把这个参数放在配置文件中。而不是传入函数参数。所以,这里报错应该是函数而不是bug。它不应该向入口函数添加额外的参数。