在 ruamel.yaml 中,如何发出带有文字字符串 "null" 的 ScalarEvent?
In ruamel.yaml, how do I emit a ScalarEvent with the literal string "null"?
我正在使用 ruamel.yaml 发出一系列事件来创建自定义 YAML 文件格式混合流样式。
我发现自己无法发出值为 "null" 的 ScalarEvent,因此它在 YAML 文件中显示为字符串 'null',而不是 YAML 关键字 null。
以代码形式,如果我尝试
dumper = yaml.Dumper(out_file, width=200)
param = 'field'
param_value = 'null'
dumper.emit(yaml.MappingStartEvent(anchor=None, tag=None, implicit=True, flow_style=True))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param_value))
dumper.emit(yaml.MappingEndEvent())
我明白了
field: null
而我想看看
field: 'null'
您的代码不完整,但是由于您在 flow_style=True
映射事件,你没有得到你显示的代码,也永远不会得到你想要的输出。
如果要走这条路,那就看代码唯一的地方
其中 ruamel.yaml
代码发出 ScalarNode
。它位于 serializer.py
:
self.emitter.emit(
ScalarEvent(
alias,
node.tag,
implicit,
node.value,
style=node.style,
comment=node.comment,
)
)
从中你需要添加 style
范围。进一步挖掘将表明这应该是一个
字符串,在你的例子中是单引号(“'
”),强制使用单引号标量。
import sys
import ruamel.yaml as yaml
dumper = yaml.Dumper(sys.stdout, width=200)
param = 'field'
param_value = 'null'
dumper.emit(yaml.StreamStartEvent())
dumper.emit(yaml.DocumentStartEvent())
# !!!! changed flow_style in the next line
dumper.emit(yaml.MappingStartEvent(anchor=None, tag=None, implicit=True, flow_style=False))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param))
# added style= in next line
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), style="'", value=param_value))
dumper.emit(yaml.MappingEndEvent())
dumper.emit(yaml.DocumentEndEvent())
dumper.emit(yaml.StreamEndEvent())
这给了你想要的:
field: 'null'
但是我认为你让你的生活变得比必要的更困难。 ruamel.yaml
确实
在往返过程中保持流式,然后创建一个功能数据结构并将其转储
而不是恢复使用事件驱动自卸车:
import sys
import ruamel.yaml
yaml_str = """\
a:
- field: 'null'
x: y
- {field: 'null', x: y}
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
for i in range(2):
data["a"].append(ruamel.yaml.comments.CommentedMap([("a", "b"), ("c", "d")]))
data["a"][-1].fa.set_flow_style()
yaml.dump(data, sys.stdout)
这给出:
a:
- field: 'null'
x: y
- {field: 'null', x: y}
- a: b
c: d
- {a: b, c: d}
我正在使用 ruamel.yaml 发出一系列事件来创建自定义 YAML 文件格式混合流样式。
我发现自己无法发出值为 "null" 的 ScalarEvent,因此它在 YAML 文件中显示为字符串 'null',而不是 YAML 关键字 null。
以代码形式,如果我尝试
dumper = yaml.Dumper(out_file, width=200)
param = 'field'
param_value = 'null'
dumper.emit(yaml.MappingStartEvent(anchor=None, tag=None, implicit=True, flow_style=True))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param_value))
dumper.emit(yaml.MappingEndEvent())
我明白了
field: null
而我想看看
field: 'null'
您的代码不完整,但是由于您在 flow_style=True
映射事件,你没有得到你显示的代码,也永远不会得到你想要的输出。
如果要走这条路,那就看代码唯一的地方
其中 ruamel.yaml
代码发出 ScalarNode
。它位于 serializer.py
:
self.emitter.emit(
ScalarEvent(
alias,
node.tag,
implicit,
node.value,
style=node.style,
comment=node.comment,
)
)
从中你需要添加 style
范围。进一步挖掘将表明这应该是一个
字符串,在你的例子中是单引号(“'
”),强制使用单引号标量。
import sys
import ruamel.yaml as yaml
dumper = yaml.Dumper(sys.stdout, width=200)
param = 'field'
param_value = 'null'
dumper.emit(yaml.StreamStartEvent())
dumper.emit(yaml.DocumentStartEvent())
# !!!! changed flow_style in the next line
dumper.emit(yaml.MappingStartEvent(anchor=None, tag=None, implicit=True, flow_style=False))
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), value=param))
# added style= in next line
dumper.emit(yaml.ScalarEvent(anchor=None, tag=None, implicit=(True, True), style="'", value=param_value))
dumper.emit(yaml.MappingEndEvent())
dumper.emit(yaml.DocumentEndEvent())
dumper.emit(yaml.StreamEndEvent())
这给了你想要的:
field: 'null'
但是我认为你让你的生活变得比必要的更困难。 ruamel.yaml
确实
在往返过程中保持流式,然后创建一个功能数据结构并将其转储
而不是恢复使用事件驱动自卸车:
import sys
import ruamel.yaml
yaml_str = """\
a:
- field: 'null'
x: y
- {field: 'null', x: y}
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
for i in range(2):
data["a"].append(ruamel.yaml.comments.CommentedMap([("a", "b"), ("c", "d")]))
data["a"][-1].fa.set_flow_style()
yaml.dump(data, sys.stdout)
这给出:
a:
- field: 'null'
x: y
- {field: 'null', x: y}
- a: b
c: d
- {a: b, c: d}