gpt4 book ai didi

python - 使用键/值继承,但将其排除在 pyyaml 的结果之外

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:30 36 4
gpt4 key购买 nike

PyYAML 在键/值对的继承方面非常酷,但是是否可以在最终结构中不包含以下 base_value_struct。

Default_profile: &Default_profile
base_value_structure: &base_value_structure
path_to_value: 'path to element'
selector_type: 'XPATH'
required: false
title:
<<: *base_value_structure
path_to_value: "//div[@id='ctitle']/text()"

解析上面的配置后,base_value_struct 就在结果中。我可以阻止这种行为还是需要手动过滤它?

期望的结果:

{"Default_profile": {
"title": {
"path_to_value": "//div[@id='ctitle']/text()",
"selector_type": "XPATH",
"required": False }
}
}

最佳答案

您需要手动过滤掉它。 specification中没有规定合并键。

如果您不将映射加载为 Python 字典,而是加载为更复杂的类型,则可以自动过滤掉这些“基本”映射,但代价是 YAML 文件的语法变得复杂。

还应该可以调整解析器以保留用作基础的映射列表并删除已使用的映射列表。或者,如果只有“基本”映射有 anchor ,则仅删除它们。这些都不能按原样使用 PyYAML 完成。

但是,锚定映射不一定具有与键相同的 anchor 名称。锚定映射根本不必是键值(如您的示例中所示)。通过重新排序 YAML 文件,您可以更轻松地删除“基础”甚至多个基础:

from pprint import pprint
import ruamel.yaml as yaml

yaml_str = """\
-
- &base_value_structure
path_to_value: 'path to element'
selector_type: 'XPATH'
required: false
- &base_other_structure
key1: val1
key2: val2
- Default_profile: &Default_profile
title:
<<: *base_value_structure
path_to_value: "//div[@id='ctitle']/text()"
"""

data = yaml.load(yaml_str)[1]
pprint(data)

给出:

{'Default_profile': {'title': {'path_to_value': "//div[@id='ctitle']/text()",
'required': False,
'selector_type': 'XPATH'}}}

在上面我使用了我的 ruamel.yaml库,它是 PyYAML 的衍生版本,在本示例中,它的工作方式应与 PyYAML 相同,但如果您使用其往返加载器/转储器,它将保留合并信息。

关于python - 使用键/值继承,但将其排除在 pyyaml 的结果之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873977/

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