为 PyYAML 转储的一部分指定样式

Posted

技术标签:

【中文标题】为 PyYAML 转储的一部分指定样式【英文标题】:Specifying styles for portions of a PyYAML dump 【发布时间】:2012-12-09 16:02:42 【问题描述】:

我将 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)对于可读性也很好。

【问题讨论】:

【参考方案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,所以我必须指定标签,但系统确实可以工作。

【讨论】:

您对 dumper.represent_sequencedumper.represent_dict 没有选项 flow_style 的评论是否仍然是最新的?见pyyaml.org/wiki/PyYAMLDocumentation#Dumper 实际上我尝试将您的flowmap 应用于序列:` - 边缘:\n - [1,2]\n - [2, 1, [1, 0]]. I'd like to have every edge on single separate line (as denoted by \n). Currently, it looks like this: - 边:\n - [1,2] \n - 1\n - 2\n - [1, 0]` 是的,我的评论仍然有效; represent_mapping 有,但其他两个没有;它们可能只是represent_mapping 的包装器。至于你在做什么,flowmap 不是你想要的。您希望拥有 flow_style=True 的序列(在边缘下:),而不是映射。 你能看看我发布的question。谢谢。

以上是关于为 PyYAML 转储的一部分指定样式的主要内容,如果未能解决你的问题,请参考以下文章

强制 pyYAML 持续转储

PyYaml - 使用特殊字符(即重音符号)转储 unicode

我可以在 yaml/pyyaml 中转储空白而不是 null 吗?

在 PyYAML 中保存/转储带有注释的 YAML 文件

格式化 PyYAML 转储()输出

PyYAML 可以按非字母顺序转储 dict 项目吗?