不同的YAML数组表示

时间:2015-07-16 05:46:16

标签: python ruby yaml pyyaml

我正在使用Python和PyYAML编写一个文件类型转换器,用于我多次翻译和从YAML文件进行翻译的项目。然后,这些文件由我无法控制的单独服务使用,因此我需要将YAML转换回原来相同的状态。我的原始文件包含以下部分:

key:
- value1
- value2
- value3

使用{key: [value1,value2,value3]}评估为yaml.load()。当我将其翻译回YAML时,我的新文件如下所示:

key: [value1,value2,value3]

我的问题是,就YAML文件的各种语言解析器而言,这两种形式是否相同。显然使用PyYaml,这些是等价的,但这适用于Ruby或应用程序正在使用的其他语言吗?如果没有,那么应用程序将无法正确显示数据。

2 个答案:

答案 0 :(得分:3)

是的,对于遵循规范的任何YAML解析器,它们是等效的。您可以在此处阅读规范:http://www.yaml.org/spec/1.2/spec.html

Section 3.2.3.1特别相关(强调我的):

  

3.2.3.1。节点样式

     

每个节点都以某种样式呈现,具体取决于其种类。 节点样式是演示文稿详细信息,不会反映在序列化树或表示图中。有两组样式。块样式使用缩进来表示结构;相比之下,流式样式依赖于明确的指标。

为了澄清,节点是YAML中的任何结构,包括数组(在规范中称为 sequence )。单行样式称为流程序列(参见第7.4.1节),多行样式称为块序列(第8.2.1节)。兼容的解析器将两者反序列化为相同的对象。

答案 1 :(得分:2)

正如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

它不仅保留了流/块样式,还保留了注释和键排序,还有一些更透明。这使得比较(例如,当使用一些修订控制系统来检查YAML文件时)更容易。

对于阅读YAML文件的服务,这一切都没有区别,但为了便于检查您是否正在正确地转换事物,它确实如此。