我使用YAML用于在计算机和人可编辑的和可读的输入格式的模拟器。 对于人类的可读性,输入一些地方大多是适合于阻止风格,而流式西服别人更好。
对于PyYAML默认是使用块风格哪里有嵌套的地图或序列,并流式的其他地方。 * default_flow_style *允许一个选择全流式或全框式。
但我想输出文件的更多形式的
bonds:
- { strength: 2.0 }
- ...
tiles:
- { color: red, edges: [1, 0, 0, 1], stoic: 0.1}
- ...
args:
block: 2
Gse: 9.4
可以看出,这并不遵循一个风格一致的模式贯穿始终,这取决于文件的一部分,而不是改变。 从本质上讲,我希望能够指定在某些块样式序列的所有值在流风格。 有没有办法让那种精细级别的控制权倾? 能够倾倒在一个特定的顺序顶层映射,同时不需要顺序(如OMAP)将是很好的,以及以提高可读性。
原来,这可以通过申述定义子类我想不default_flow_style遵循每个项目,然后倾倒之前将需要的一切来完成。 在这种情况下,这意味着我得到的是这样的:
class blockseq( dict ): pass
def blockseq_rep(dumper, data):
return dumper.represent_mapping( u'tag:yaml.org,2002:map', data, flow_style=False )
class flowmap( dict ): pass
def flowmap_rep(dumper, data):
return dumper.represent_mapping( u'tag:yaml.org,2002:map', data, flow_style=True )
yaml.add_representer(blockseq, blockseq_rep)
yaml.add_representer(flowmap, flowmap_rep)
def dump( st ):
st['tiles'] = [ flowmap(x) for x in st['tiles'] ]
st['bonds'] = [ flowmap(x) for x in st['bonds'] ]
if 'xgrowargs' in st.keys(): st['xgrowargs'] = blockseq(st['xgrowargs'])
return yaml.dump(st)
烦人,要指定的更容易使用的dumper.represent_list和dumper.represent_dict不允许flow_style,所以我必须指定标签,但系统不工作。