1. 安装yaml
ruamel
安装:
conda install ruamel.yaml
omegaconf
安装:Omegaconf - Releases
2. Yaml格式说明
2.1 数据类型(yaml
无强制类型限定)
Python中使用yaml
无法实现对数据类型的强制限定,(在原生yaml中可以使用类型强制转换“!!float 123”,不过ruamel.yaml
不支持此语法);
在这里我们使用!tag
方式来实现来数据类型的声明;
3. 读取yaml
# 读取yaml文件
with open(os.path.join(records, "cfg.yaml"), "r", encoding="utf-8") as yaml_file:
yaml_dict = yaml.round_trip_load(yaml_file)
# 使用OmegaConf载入yaml文件
dict_config = OmegaConf.load("cfg.yaml")
4. 写入yaml
# 写入到yaml文件
with open(os.path.join(records, "cfg.yaml"), "w", encoding="utf-8") as f:
yaml.dump(dictionary, f)
5. OmegaConf笔记
5.1 新建字典 [doc]
conf = OmegaConf.create()
5.2 更新字典
OmegaConf.merge()
≈
\approx
≈ dict.update()
OmegaConf.merge()
的作用跟dict.update()
类似,不过dict.update()
函数名的意义会更加明确一些,实际上:OmegaConf.merge()
也是以最后输入的config为配置值的最终设置,相当于“后来为先”原则,即时间最顺序最后一个config优先级最高。
Note
OmegaConf.merge()
的更新还具有顺序保持的特点,即在参数顺序上时依照“先来为序”的原则,会按照config1的顺序对参数进行排列。
5.3 实现get_leaves_str()
在实现get_leaves_str()时,Jasha在Dsicussions给我们提供了这样一个测试样例:
def get_leaves_no_check_misses(cfg, parent=None):
if not OmegaConf.is_config(cfg):
assert parent, cfg
return [f"{parent} = {str(cfg)}"]
if OmegaConf.is_list(cfg):
items = enumerate(cfg)
elif OmegaConf.is_config(cfg):
items = cfg.items()
else:
raise NotImplementedError
string = []
parent = f"{parent}." if parent else ''
for k, v in items:
string += get_leaves_no_check_misses(v, f"{parent}{k}")
return string
# Test case from GitHub
conf = OmegaConf.create({'abc': '???'})
print("\n".join(get_leaves_no_check_misses(conf)))
>>>
File "/home/songyuc/software/python/anaconda/anaconda3/envs/conda-general/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 445, in _get_impl
return self._resolve_with_default(
File "/home/songyuc/software/python/anaconda/anaconda3/envs/conda-general/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 63, in _resolve_with_default
raise MissingMandatoryValue("Missing mandatory value: $FULL_KEY")
omegaconf.errors.MissingMandatoryValue: Missing mandatory value: abc
full_key: abc
object_type=dict
可以看到,在OmegaConf
中,如果键值的value是missing的状态,访问此键对应的值会报错;