指定样式的PyYAML转储的部分(Specifying styles for portions of

2019-07-17 12:02发布

我使用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)将是很好的,以及以提高可读性。

Answer 1:

原来,这可以通过申述定义子类我想不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,所以我必须指定标签,但系统不工作。



文章来源: Specifying styles for portions of a PyYAML dump
标签: yaml pyyaml