如何将Hydra/OmegaConf配置转换为Python嵌套字典或列表?
OmegaConf/Hydra配置转Python原生嵌套结构的方法
直接使用OmegaConf官方提供的OmegaConf.to_container()接口即可完成转换,该接口兼容所有OmegaConf配置对象(包括Hydra框架返回的cfg配置对象),可以直接输出Python原生的dict、list嵌套结构。
常用可配置参数
resolve: bool:设置为True时会自动解析配置中的插值占位符(例如${db.host}这类变量引用),直接替换为最终的实际值,默认值为Falsethrow_on_missing: bool:设置为True时如果配置中存在未填充的???缺失标记会直接抛出异常,默认值为False,会保留???字符串enum_to_str: bool:设置为True时会把配置中的Enum枚举值转换为对应的字符串内容,不会保留枚举对象,默认值为False
示例代码
from omegaconf import OmegaConf # 这里的conf也可替换为Hydra任务中拿到的cfg配置对象 conf = OmegaConf.create({ "db": { "host": "localhost", "port": 3306, "conn_url": "${db.host}:${db.port}" }, "allow_ip": ["127.0.0.1", "192.168.1.0/24"] }) # 转换为Python原生结构,同时解析插值变量 native_conf = OmegaConf.to_container(conf, resolve=True) print(type(native_conf)) # 输出 <class 'dict'> print(native_conf["db"]["conn_url"]) # 输出 localhost:3306 print(type(native_conf["allow_ip"])) # 输出 <class 'list'>
注意事项
不要手动递归遍历OmegaConf对象实现转换,官方内置方法已经兼容了所有OmegaConf的特殊语法和边界场景,稳定性和性能都远高于自定义实现。
内容的提问来源于stack exchange,提问作者Rylan Schaeffer
相关产品推荐
相关产品推荐

