在以下情况下,您可以编写仅使用流样式发出序列的自定义表示器
该序列本身不包含任何集合(即只包含标量).这不是微不足道的,而且可能也不是必要的.
正如其他答案所指出的,即使你不知道该做什么,最好是
判断ruamel.yaml
是否可以往返你想要的东西:
import sys
import ruamel.yaml
yaml_str = """\
a:
b:
c:
x: 1
y: 1
d: [1, 2, 3]
e:
f: 1
g: 1
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)
这提供了:
a:
b:
c:
x: 1
y: 1
d: [1, 2, 3]
e:
f: 1
g: 1
因此,它可以往返您想要的东西,之后您可以判断您的特殊物品在装载过程中是如何构造的:
flow_list = data['a']['b']['d']
print(type(flow_list), flow_list)
然后,它可以提供:
<class 'ruamel.yaml.comments.CommentedSeq'> [1, 2, 3]
所以您需要构造一个CommentedSeq
并搜索它,然后使用ruamel.yaml和flow样式
在StackOverflow上应该会得到有限的答案列表(例如
this one)
要给出一个完整的例子来从头开始构建并转储某个东西:
import sys
import ruamel.yaml
def FSlist(l): # convert list into flow-style (default is block style)
from ruamel.yaml.comments import CommentedSeq
cs = CommentedSeq(l)
cs.fa.set_flow_style()
return cs
yaml = ruamel.yaml.YAML()
data = dict(a=dict(b=dict(c=dict(x=1, y=1), d=FSlist([1, 2, 3]), e=dict(f=1, g=1))))
yaml.dump(data, sys.stdout)
结果得到了接近你想要的东西:
a:
b:
c:
x: 1
y: 1
d: [1, 2, 3]
e:
f: 1
g: 1