yaml - 指定 PyYAML 转储部分的样式

标签 yaml pyyaml

我在计算机上使用 YAML,在模拟器上使用人工可编辑和可读的输入格式。为了人类可读性,输入的某些部分大多适合 block 样式,而流样式更适合其他部分。

PyYAML 的默认设置是在有嵌套映射或序列的地方使用 block 样式,在其他地方使用流样式。 *default_flow_style* 允许选择全流式或全 block 式。

但我想输出更多形式的文件

bonds:
- { strength: 2.0 }
- ...
tiles:
- { color: red, edges: [1, 0, 0, 1], stoic: 0.1}
- ...
args: 
    block: 2
    Gse: 9.4

可以看出,这并没有遵循一致的样式模式,而是根据文件的部分而变化。本质上,我希望能够指定某些 block 样式序列中的所有值都采用流样式。有没有什么方法可以对倾销进行精细控制?能够以特定顺序转储顶级映射而不需要该顺序(例如,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,所以我必须指定标签,但系统确实可以工作。

关于yaml - 指定 PyYAML 转储部分的样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14000893/

相关文章:

java - Minecraft Bukkit YML 列表问题

python - YAML 加载器将路径视为十六进制数

python:如何在yaml文件中添加新键和值

python - Yaml 转储 python 字典作为不带单引号的映射

python - 基于 YAML 数据的条件 Python for 循环

python - 如何迭代 YAML 文件以给出 PYTHON 中不同列表中项目的所有可能组合

ruby-on-rails - 回形针上传yml文件

loops - 使用循环添加到 yaml 列表

ruby - 一个 YAML 对象可以引用另一个吗?

python - PyYAML 与 Python 3.x