gpt4 book ai didi

python - 将 YAML 文件加载到保留别名的 Python 中

转载 作者:行者123 更新时间:2023-12-05 05:40:05 27 4
gpt4 key购买 nike

我正在制作一个程序,需要检查某些字段是否使用正确的别名字符串定义。例如:

networks:
base:
name: build
address: &dummyname
url: 192.168.1.1
port: 8080
first:
name: masterA
address: *dummyname
second:
name: masterB
address: *dummyname

我需要检查字段 address 是否在 first 和 second 中定义了别名“*dummyname”,无论别名的内容是什么。

当使用 PyYaml 执行加载时,总是呈现别名,所以我无法检查:

data = yaml.safe_load(file_data)

呈现为 python 字典的数据:

networks:
base:
name: build
address:
url: 192.168.1.1
port: 8080
first:
name: masterA
address:
url: 192.168.1.1
port: 8080
second:
name: masterB
address:
url: 192.168.1.1
port: 8080

我看到过类似的帖子,将 python 对象转储到 YAML 而不创建别名/ anchor ,但我还没有找到解决方案。

如何访问 YAML 文档中使用的别名?

最佳答案

正如您所指出的,PyYAML 不允许您访问 anchor /别名,它在内部使用它解决这个问题。当您再次转储 data 时,您会注意到您获得了一个通用 anchor (例如 &id0001)。

如果您使用 ruamel.yaml 以这种方式来回传输您的数据,您可以看到您的保留实际 anchor /别名:

import sys
import ruamel.yaml

file_in = Path('input.yaml')

yaml = ruamel.yaml.YAML()
data = yaml.load(file_in)
yaml.dump(data, sys.stdout)

如下所示:

networks:
base:
name: build
address: &dummyname
url: 192.168.1.1
port: 8080
first:
name: masterA
address: *dummyname
second:
name: masterB
address: *dummyname

您可以检查加载的数据结构:

# you get the same object, whether using `first`, `second` or `base`
address = data['networks']['first']['address']
print(address, type(address))
print('\n'.join([k for k in dir(address) if k[0] != '_'])) # skip the build-in attributes

给出:

ordereddict([('url', '192.168.1.1'), ('port', 8080)]) <class 'ruamel.yaml.comments.CommentedMap'>
add_referent
add_yaml_merge
anchor
ca
clear
copy
copy_attributes
fa
fromkeys
get
insert
items
keys
lc
merge
mlget
move_to_end
non_merged_items
pop
popitem
rya
setdefault
tag
update
update_key_value
values
yaml_add_eol_comment
yaml_anchor
yaml_end_comment_extend
yaml_key_comment_extend
yaml_set_anchor
yaml_set_comment_before_after_key
yaml_set_start_comment
yaml_set_tag
yaml_value_comment_extend

可能的候选者是属性 anchor,这实际上是一个 Anchor 实例可以检索原始字符串:

print(f'anchor: {address.anchor.value}')

给予:

anchor: dummyname

请注意,这些内部结构可能会发生变化,因此请固定您正在使用的 ruamel.yaml 版本,然后升级前测试。

关于python - 将 YAML 文件加载到保留别名的 Python 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72492637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com