不同的 YAML 数组表示
Different YAML array representations
我正在使用 Python 和 PyYAML 为一个项目编写一个文件类型转换器,我在这个项目中多次与 YAML 文件进行相互转换。这些文件随后由我无法控制的单独服务使用,因此我需要将 YAML 翻译回与我最初得到的相同的内容。我的原始文件包含以下部分:
key:
- value1
- value2
- value3
使用 yaml.load()
的计算结果为 {key: [value1,value2,value3]}
。当我将其翻译回 YAML 时,我的新文件如下所示:
key: [value1,value2,value3]
我的问题是,就 YAML 文件的各种语言解析器而言,这两种形式是否等效。显然使用 PyYaml,这些是等效的,但这是否适用于 Ruby 或应用程序正在使用的其他语言?否则,应用程序将无法正常显示数据。
是的,对于任何遵循规范的 YAML 解析器,它们都是等价的。您可以在此处阅读规范:http://www.yaml.org/spec/1.2/spec.html
Section 3.2.3.1 特别相关(强调我的):
3.2.3.1. Node Styles
Each node is presented in some style, depending on its kind. The node style is a presentation detail and is not reflected in the serialization tree or representation graph. There are two groups of styles. Block styles use indentation to denote structure; In contrast, flow styles styles rely on explicit indicators.
澄清一下,node 是 YAML 中的任何结构,包括数组(在规范中称为 sequences)。单行样式称为流序列(参见第 7.4.1 节),多行样式称为块序列(第 8.2.1 节)。兼容的解析器会将两者反序列化为相同的对象。
正如 Jordan 已经指出的那样,节点样式是一个序列化细节。并且输出等同于您的输入。
使用 PyYAML,您可以在转储时使用 default_flow_style
关键字获得相同的块样式输出:
yaml.dump(yaml.load("""\
key:
- value1
- value2
- value3
"""), sys.stdout, default_flow_style=False)
给你:
key:
- value1
- value2
- value3
如果您要使用 ruamel.yaml 的往返功能(免责声明:我是该软件包的作者),您可以这样做:
import sys
import ruamel.yaml as yaml
yaml_str = """\
key:
- value1
- value2 # this is the second value
- value3
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
yaml.dump(data, sys.stdout, Dumper=yaml.RoundTripDumper, default_flow_style=False)
获得:
key:
- value1
- value2 # this is the second value
- value3
它不仅保留了 flow/block 风格,而且注释和键顺序也更加透明。这使得比较(例如,当使用某些版本控制系统签入 YAML 文件时)变得更加容易。
对于读取 YAML 文件的服务来说,这一切都没有区别,但为了便于检查您是否正确转换,它确实如此。
我正在使用 Python 和 PyYAML 为一个项目编写一个文件类型转换器,我在这个项目中多次与 YAML 文件进行相互转换。这些文件随后由我无法控制的单独服务使用,因此我需要将 YAML 翻译回与我最初得到的相同的内容。我的原始文件包含以下部分:
key:
- value1
- value2
- value3
使用 yaml.load()
的计算结果为 {key: [value1,value2,value3]}
。当我将其翻译回 YAML 时,我的新文件如下所示:
key: [value1,value2,value3]
我的问题是,就 YAML 文件的各种语言解析器而言,这两种形式是否等效。显然使用 PyYaml,这些是等效的,但这是否适用于 Ruby 或应用程序正在使用的其他语言?否则,应用程序将无法正常显示数据。
是的,对于任何遵循规范的 YAML 解析器,它们都是等价的。您可以在此处阅读规范:http://www.yaml.org/spec/1.2/spec.html
Section 3.2.3.1 特别相关(强调我的):
3.2.3.1. Node Styles
Each node is presented in some style, depending on its kind. The node style is a presentation detail and is not reflected in the serialization tree or representation graph. There are two groups of styles. Block styles use indentation to denote structure; In contrast, flow styles styles rely on explicit indicators.
澄清一下,node 是 YAML 中的任何结构,包括数组(在规范中称为 sequences)。单行样式称为流序列(参见第 7.4.1 节),多行样式称为块序列(第 8.2.1 节)。兼容的解析器会将两者反序列化为相同的对象。
正如 Jordan 已经指出的那样,节点样式是一个序列化细节。并且输出等同于您的输入。
使用 PyYAML,您可以在转储时使用 default_flow_style
关键字获得相同的块样式输出:
yaml.dump(yaml.load("""\
key:
- value1
- value2
- value3
"""), sys.stdout, default_flow_style=False)
给你:
key:
- value1
- value2
- value3
如果您要使用 ruamel.yaml 的往返功能(免责声明:我是该软件包的作者),您可以这样做:
import sys
import ruamel.yaml as yaml
yaml_str = """\
key:
- value1
- value2 # this is the second value
- value3
"""
data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
yaml.dump(data, sys.stdout, Dumper=yaml.RoundTripDumper, default_flow_style=False)
获得:
key:
- value1
- value2 # this is the second value
- value3
它不仅保留了 flow/block 风格,而且注释和键顺序也更加透明。这使得比较(例如,当使用某些版本控制系统签入 YAML 文件时)变得更加容易。
对于读取 YAML 文件的服务来说,这一切都没有区别,但为了便于检查您是否正确转换,它确实如此。