python - 如何使用 PyYaml 或 Ruamel.yaml 仅转储带有 flow_style 的列表
问题描述
我有以下内容:
data = {"values": list(range(3)),'some_key': {'value': 2, 'unit': 'm'}}
当我将这个字典转储到 YAML 时,default_flow_style=True
我得到了以下内容:
>>> print(yaml.dump( data, default_flow_style=False))
some_key:
unit: m
value: 2
values:
- 0
- 1
- 2
>>> print(yaml.dump( data, default_flow_style=True))
{some_key: {unit: m, value: 2}, values: [0, 1, 2]}
>>> print(yaml.dump( data, default_flow_style=None))
some_key: {unit: m, value: 2}
values: [0, 1, 2]
我想转储这个字典,保持values
with flow_style (就像执行时一样default_flow_style=None
,default_flow_style=True
但保持与some_key
使用时完全相同的行为default_flow_style=False
。
有可能实现这一目标吗?
使用 PyYAML 5.3.1
解决方案
如果不更改作为转储程序一部分的表示器,则无法使用 PyYAML 实现该目标。
在 ruamel.yaml 中,您可以将节点标记为以流模式转储,并且“以下”的所有内容也将被转储为流模式(必须如此):
import sys
import ruamel.yaml
def flist(x):
retval = ruamel.yaml.comments.CommentedSeq(x)
retval.fa.set_flow_style() # fa -> format attribute
return retval
data = {"values": flist(range(3)),'some_key': {'value': 2, 'unit': 'm'}}
yaml = ruamel.yaml.YAML()
yaml.dump(data, sys.stdout)
这使:
values: [0, 1, 2]
some_key:
value: 2
unit: m
您首先获得values
密钥,因为它在定义中是第一个data
(假设您使用的是最新的 Python 3)
推荐阅读
- express - ExpressJS - 处理多个页面/分页
- java - 目标运行时 WebSphere Application Server 传统版 V9.0 未定义
- python - 获得最大收益的算法
- filesystems - 在 ubifs 卷上应用增量补丁
- html - 具有三种状态的复选框
- python - 如何仅在 tkinter 中更改所选文本的属性
- firebase - Firebase Cloud Functions:`convert` 因 ChildProcessError 而失败
- reactjs - 如何将 react-helmet 与 netlify 预渲染一起使用?
- python - 如何使用 atom-python-run 包在 Atom 中运行 python 脚本?
- git - 旧的提交出现在新的拉取请求中?