使用 key/value 继承但将其保留在 pyyaml 的结果之外
Use key/value inheritence but leave it out of the result in pyyaml
PyYAML 在 key/value 对的继承方面非常酷,但是否可以在最终结构中不包含以下 base_value_structure。
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_structure在结果中。我可以阻止这种行为还是需要手动过滤?
想要的结果:
{"Default_profile": {
"title": {
"path_to_value": "//div[@id='ctitle']/text()",
"selector_type": "XPATH",
"required": False }
}
}
您需要手动过滤掉它。合并键specification中没有规定
如果您不将映射加载为 Python 字典,而是作为更复杂的类型,您可以自动过滤掉这些 "base" 映射,但代价是使 YAML 的语法复杂化文件。
还应该可以调整解析器以保留用作基础的映射列表并删除使用的映射。或者,如果只有 "base" 个映射有一个锚点,则只删除那些。这些都不能用 PyYAML 按原样完成。
然而,锚定映射不必与键具有相同的锚定名称。锚定映射根本不必是键值(如您的示例中所示)。通过重新排序 YAML 文件,您可以更轻松地删除 "base" 甚至多个碱基:
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 一样工作,但是如果你使用它的往返它会保留合并信息loader/dumper。
PyYAML 在 key/value 对的继承方面非常酷,但是否可以在最终结构中不包含以下 base_value_structure。
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_structure在结果中。我可以阻止这种行为还是需要手动过滤?
想要的结果:
{"Default_profile": {
"title": {
"path_to_value": "//div[@id='ctitle']/text()",
"selector_type": "XPATH",
"required": False }
}
}
您需要手动过滤掉它。合并键specification中没有规定
如果您不将映射加载为 Python 字典,而是作为更复杂的类型,您可以自动过滤掉这些 "base" 映射,但代价是使 YAML 的语法复杂化文件。
还应该可以调整解析器以保留用作基础的映射列表并删除使用的映射。或者,如果只有 "base" 个映射有一个锚点,则只删除那些。这些都不能用 PyYAML 按原样完成。
然而,锚定映射不必与键具有相同的锚定名称。锚定映射根本不必是键值(如您的示例中所示)。通过重新排序 YAML 文件,您可以更轻松地删除 "base" 甚至多个碱基:
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 一样工作,但是如果你使用它的往返它会保留合并信息loader/dumper。