如何往返ruamel.yaml字符串,如;关于;
当使用一些YAML往返时,我看到以下问题。鉴于这一投入:如何往返ruamel.yaml字符串,如;关于;,ruamel.yaml,Ruamel.yaml,当使用一些YAML往返时,我看到以下问题。鉴于这一投入: root: matchers: - select: "response.body#state" test: all expected: "on" 我看到这个输出: root: matchers: - select: response.body#state test: all expected: on 注意,在YAML中,on解析为布尔值true而off解析为fal
root:
matchers:
- select: "response.body#state"
test: all
expected: "on"
我看到这个输出:
root:
matchers:
- select: response.body#state
test: all
expected: on
注意,在YAML中,on
解析为布尔值true
而off
解析为false
以下代码用于读/写:
# Use the default (round-trip) settings.
yaml = YAML()
if args.source == '-':
src = sys.stdin
else:
src = open(args.source)
doc = yaml.load(src)
process(args.tag, set(args.keep.split(',')), doc)
if args.destination == '-':
dest = sys.stdout
else:
dest = open(args.destination, 'w')
yaml.dump(doc, dest)
过程
功能未修改值。在对结构进行爬网后,它仅删除输入中带有特殊标记的内容
如何使输出成为字符串而不是布尔值?您可以这样写:
注意,在YAML中,on
解析为布尔值true
而off
解析为false
这句话不是真的(或者更好:
十年来都不是这样)。如果在您的
YAML,与您的输出一样,使用ruamel.YAML时显然不是这样:
import sys
import ruamel.yaml
yaml_str = """\
root:
matchers:
- select: response.body#state
test: all
expected: on
"""
yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
expected = data['root']['matchers'][0]['expected']
print(type(expected), repr(expected))
其中:
<class 'str'> 'on'
由于这提供了准确的输入:
root:
matchers:
- select: "response.body#state"
test: all
expected: "on"
然而,更好的选择可能是您实际指定
YAML必须通过以下方式符合YAML 1.1规范:
您的意图和输出文档明确:
请注意,“unquoted”YAML 1.2输入给出了输出,其中on
被引用:
%YAML 1.1
---
root:
matchers:
- select: response.body#state
test: all
expected: 'on'
迷人的!谢谢你的全面回复。我发现很多工具,包括Kubernetes和OpenAPI解析器,都不能正确地支持YAML 1.2布尔。例如,见。我喜欢你的例子保留引号。这允许人们在下游工具需要的情况下格式化文档,而我的处理器将保留其格式。这对用户来说应该是最小的惊喜。谢谢你的图书馆!
yaml_str = """\
root:
matchers:
- select: response.body#state
test: all
expected: on
"""
yaml_in = ruamel.yaml.YAML()
yaml_out = ruamel.yaml.YAML()
yaml_out.indent(sequence=4, offset=2)
yaml_out.version = (1, 1)
data = yaml_in.load(yaml_str)
yaml_out.dump(data, sys.stdout)
%YAML 1.1
---
root:
matchers:
- select: response.body#state
test: all
expected: 'on'