如何使用PyYAML覆盖YAML配置锚点并使更新全局生效?
YAML锚点值批量更新的实现方法
以下是config.yml文件示例:
key_setting: &key_setting True main_params: param_A: param_A_1: 1 param_A_2: 2 param_A_setting: *key_setting param_B: param_B_1: 3 param_B_2: 4 param_B_setting: *key_setting
执行yaml.load(open('config.yml').read())后,param_A_setting和param_B_setting的值都会是True,这个值由key_setting锚点定义。
如果想把key_setting锚点的值覆盖为False,并让更新同步到param_A_setting和param_B_setting,怎么仅通过修改key_setting实现,不用手动改这两个参数?
要实现这个需求,得利用YAML的合并锚点+后续覆盖特性——原始写法里的锚点绑定的是单个布尔值节点,直接覆盖key_setting没法同步到引用它的节点,因为YAML锚点是引用节点本身,不是变量关联。正确做法是把锚点指向字典(或嵌套结构),再通过后续键值覆盖实现同步更新。
修改后的config.yml示例:
key_setting: &key_setting value: True main_params: param_A: param_A_1: 1 param_A_2: 2 param_A_setting: *key_setting param_B: param_B_1: 3 param_B_2: 4 param_B_setting: *key_setting # 覆盖锚点对应的字典值 key_setting: <<: *key_setting value: False
加载后,param_A_setting.value和param_B_setting.value都会变成False。原理是:先定义包含value键的字典锚点&key_setting,文件末尾重新定义key_setting时,用<<: *key_setting合并原有锚点内容,再覆盖value为False。所有引用都指向这个字典节点,字典内容更新后,所有引用处都会同步拿到最新值。
如果不想用嵌套字典,也可以在加载YAML后通过代码修改锚点对应的节点,但这不符合“仅通过覆盖key_setting”的文件修改要求,所以文件层面的最优解就是嵌套结构+合并覆盖的方式。
内容的提问来源于stack exchange,提问作者nwly
相关产品推荐
相关产品推荐

