在多行上使用内联 Yaml 格式?
Using Inline Yaml Formatting over multiple lines?
我正在尝试创建一个用于 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"
我遇到的问题是每个重复的项目都被覆盖了。我需要让它成为字典列表的列表,但是我不知道如何让它工作。我不能只使用带方括号和大括号的内联格式,因为我正在处理的实际数据在每个字典中都有更多数据,所以行会太长。
有没有办法将其格式化为使每个词典列表分开?
我想你想要的是:
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
这表示一个映射("dictionary")有一个键,"Computers,"它的值是一个序列("list")有三个项目,每个项目都是一个映射与三个键 "Brand," "Cost" 和 "IP."
在JavaScript中,例如,它会反序列化为这个结构:
{ 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"
}
]
}
P.S。您会注意到我删除了引号。引号是 YAML 中的一种反模式——在极少数情况下它们是必需的(例如,如果您希望将“500”反序列化为字符串而不是数字)并且它们会增加很多行噪声,从而破坏YAML 的目的,即易于阅读和编辑。
P.P.S。我发现一个非常有用的实用程序是 Online YAML Parser,它会在您键入任何 YAML 输入时以 JSON 或 Python 符号显示结果。
如果您不确定某个构造的 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 可以在往返模式下为您保留这些键
我正在尝试创建一个用于 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"
我遇到的问题是每个重复的项目都被覆盖了。我需要让它成为字典列表的列表,但是我不知道如何让它工作。我不能只使用带方括号和大括号的内联格式,因为我正在处理的实际数据在每个字典中都有更多数据,所以行会太长。
有没有办法将其格式化为使每个词典列表分开?
我想你想要的是:
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
这表示一个映射("dictionary")有一个键,"Computers,"它的值是一个序列("list")有三个项目,每个项目都是一个映射与三个键 "Brand," "Cost" 和 "IP."
在JavaScript中,例如,它会反序列化为这个结构:
{ 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"
}
]
}
P.S。您会注意到我删除了引号。引号是 YAML 中的一种反模式——在极少数情况下它们是必需的(例如,如果您希望将“500”反序列化为字符串而不是数字)并且它们会增加很多行噪声,从而破坏YAML 的目的,即易于阅读和编辑。
P.P.S。我发现一个非常有用的实用程序是 Online YAML Parser,它会在您键入任何 YAML 输入时以 JSON 或 Python 符号显示结果。
如果您不确定某个构造的 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 可以在往返模式下为您保留这些键