在多行上使用内联Yaml格式?

时间:2015-07-24 17:01:27

标签: dictionary formatting yaml inline

我正在尝试使用nose-testconfig创建一个YAML文件,其数据如下:

"Computers": 
    "Brand: "Dell"
    "Cost": 500
    "IP": "194.66.82.11"

    "Brand: "HP"
    "Cost": 600
    "IP": "194.66.82.13"

    "Brand: "Asus"
    "Cost": 550
    "IP": "194.66.82.15"

我遇到的问题是每个重复的项目都会被覆盖。我需要将它列为字典列表,但是我不知道如何进行这项工作。我不能只使用括号和大括号的内联格式,因为我正在使用的实际数据在每个字典中有更多的数据,因此行太长。

有没有办法以保持每个字典列表分开的方式格式化?

2 个答案:

答案 0 :(得分:3)

我认为你想要的是:

{ Computers:
  [ { Brand: "Dell",
      Cost: 500,
      IP: "192.66.82.11"
    },
    { Brand: "HP",
      Cost: 600,
      IP: "192.168.82.13"
    },
    { Brand: "Asus",
      Cost: 550,
      IP: "192.168.82.15"
    }
  ]
}

这表示带有一个键“计算机”的映射(“词典”),其值是具有三个项目的序列(“列表”),每个项目都是具有三个键“Brand”,“Cost”的映射“,和”IP。“

例如,在JavaScript中,它会反序列化为此结构:

Log.i("title", "message")

P.S。你会注意到我删除了引号。引号是YAML中的反模式 - 在极少数情况下它们是必要的(例如,如果你想要将“500”反序列化为字符串而不是数字)并且它们会增加大量的线路噪声,从而击败了YAML的目的,便于阅读和编辑。

P.P.S。我发现非常有用的实用程序是Online YAML Parser,它会在您键入的任何YAML输入时以JSON或Python表示法显示结果。

答案 1 :(得分:1)

如果您不确定某个构造的YAML应该如何看待,那么您应该做的是用您选择的编程语言(不应该存在这种不确定性)创建构造,然后将其转储。例如。在Python中:

import sys
import ruamel.yaml

data = dict(Computers=[
    dict(Brand="Dell", Cost=500, IP="194.66.82.11"),
    dict(Brand="HP", Cost=600, IP="194.66.82.13"),
    dict(Brand="Asus", Cost=550, IP="194.66.82.15"),
    ])

yaml = YAML()
yaml.dump(data, sys.stdout)

给你:

Computers:
- IP: 194.66.82.11
  Brand: Dell
  Cost: 500
- IP: 194.66.82.13
  Brand: HP
  Cost: 600
- IP: 194.66.82.15
  Brand: Asus
  Cost: 550

你看到的是简单标量周围的引号是不必要的(但根据规范它们是允许的,因此将它们放入其中是完全可以的)。您还看到您错过了在YAML文件中放置一个列表(在块模式下由-虚线项表示)。

使用这种方式可以很容易地自己确定如何将数据格式化为有效的YAML。对于某些解析器,您需要尝试使用块或非流式样式来获得更好的可读结果,对于ruamel.yaml(我是作者)块样式是默认的,因为它是IMO,更具可读性。

请注意,YAML中映射的键根据定义是无序的,尽管ruamel.yaml可以在往返模式下为您保留这些键