如何解决ruamel.yaml - 如何在 default_flow_style=None 时输出 null 而不是 !!null ''
在 Python 中使用 ruamel.yaml,如果我使用 SafeRepresenter 或 roundtripRepresenter 和 default_flow_style 转储默认值,则按预期表示 null。
import sys
from ruamel.yaml import YAML
yaml = YAML(typ='rt')
yaml.dump({'key1': None,'url': 'https://lala/','key2': None},sys.stdout)
key1:
url: https://lala/
key2:
但是,如果我将 default_flow_style 更改为 None,则 null 的表示似乎被忽略,而 null 表示为 !!null '' 例如。
import sys
from ruamel.yaml import YAML
yaml = YAML(typ='rt')
yaml.default_flow_style = None
yaml.dump({'key1': None,sys.stdout)
key: {key1: !!null '',url: https://lala/,key2: !!null ''}
明确地为 null 设置表示没有区别,例如
SafeRepresenter.add_representer(type(None),roundtripRepresenter.represent_none)
我尝试了上述方法,但是在使用 SafeRepresenter
而不是 roundtripRepresenter
时输出为 null 时仍然是 !!null ''
。
当直接从 default_flow_style=None
使用 null
而不是对其输出进行后处理(例如查找替换)时,如何输出 !!null ''
而不是 default_flow_style=None
?
解决方法
我看到了两种可能的解决方案。
最简单的解决方案是使用 typ='safe'
而不是 typ='rt'
。这是我通常所做的,但如果您依赖 ruamel.yaml
保留评论等内容的能力,这不是一种选择。
您可以为 None
值创建一个代表,如下所示:
def represent_none(self,data):
return self.represent_scalar('tag:yaml.org,2002:null','null')
这将根据需要打印出您的 None
值:
>>> import sys
>>> from ruamel.yaml import YAML
>>> yaml = YAML(typ='rt')
>>> yaml.default_flow_style = None
>>>
>>> def represent_none(self,data):
... return self.represent_scalar('tag:yaml.org,'null')
...
>>> yaml.representer.add_representer(type(None),represent_none)
>>> yaml.dump({'key1': None,'url': 'https://lala/','key2': None},sys.stdout)
{key1: null,url: https://lala/,key2: null}
,
往返转储器尝试转储 None
作为空字符串,这不会
正确解析(然后流样式序列的末尾将是
与带有尾随逗号的序列无法区分)。
标记的输出是发射器检测到无法解析回来的结果,但它很难看,而且这个
在 ruamel.yaml
0.16.13 中修复,通过发射 null
而不是 !!null ''
,这不会影响块样式
None
的发射:
import sys
from ruamel.yaml import YAML
yaml = YAML(typ='rt')
yaml.default_flow_style = None
yaml.dump({'key1': None,sys.stdout)
给出:
{key1: null,key2: null}
您可以获得旧的行为设置 yaml.emitter.alt_null = None
。你可以
将其设置为任何值,尽管选择其他 Null
Language-Indepenent Type 值之一 (Null
,NULL
,~
) 最有意义:
import sys
import ruamel.yaml
map = ruamel.yaml.comments.CommentedMap
yaml = ruamel.yaml.YAML()
yaml.emitter.alt_null = '~'
b = map(key1=None,url='https://lala/',key2=None)
b.fa.set_flow_style()
yaml.dump(dict(a=None,b=b),sys.stdout)
给出:
a:
b: {key1: ~,key2: ~}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。