如果使用感叹号,为什么会在yaml文件的输出中得到引号?

时间:2018-12-04 12:07:21

标签: python yaml ruamel.yaml

我创建了一个名称为main.yaml的yaml文件,但我希望输出如下:

# example
Name:
  Job: abcd
  Addresss: xyz
  client_id: 641
test: !include test.yaml  # new key

我不想在输出中使用引号。那么如何防止引号出现在输出中?

------------------------------代码----------

import sys
from pathlib import Path
from ruamel.yaml import YAML
from ruamel.yaml.scalarstring import SingleQuotedScalarString, DoubleQuotedScalarString

inp = """\
# example
Name:
  Job: abcd
  Addresss: xyz
  client_id: 641
"""

opath2= Path('main.yaml')

with YAML(output=opath2) as yaml:
  yaml.indent(sequence=4, offset=2)
  code = yaml.load(inp)
  code.insert(1, 'test', '!include test.yaml', comment="new key")
  yaml.dump(code, sys.stdout)

--------------------------------输出---------------- --------------

# example
Name:
  Job: abcd
  Addresss: xyz
  client_id: 641
test: '!include test.yaml'  # new key

1 个答案:

答案 0 :(得分:1)

  

我不想在输出中使用引号。那么如何防止引号出现在输出中?

在YAML中,字符串只有在没有其他含义的情况下才能被取消引用。 124是数字,而不是字符串。 true是布尔值,而不是字符串。 !foo表示tag,而不是字符串。因此,如果您想要以感叹号开头的无引号的字符串,则很不走运,无法在YAML中做到这一点。

如果您真的想插入标签(如deceze认为的那样),则需要做一些工作。最简单的方法是实际实现一个这样表示的类。

import ruamel

class Include(ruamel.yaml.YAMLObject):
    yaml_constructor = ruamel.yaml.RoundTripConstructor
    yaml_representer = ruamel.yaml.RoundTripRepresenter
    yaml_tag = '!include'

    def __init__(self, file):
        self.file = file

    @classmethod
    def from_yaml(cls, loader, node):
        return cls(loader.construct_scalar(node))

    @classmethod
    def to_yaml(cls, dumper, data):
        if isinstance(data.file, ruamel.yaml.scalarstring.ScalarString):
            style = data.file.style  # ruamel.yaml>0.15.8
        else:
            style = None
        return dumper.represent_scalar(cls.yaml_tag, data.file, style=style)

(从ruamel/_test/test_add_xxx.py无耻地复制。)然后您就可以

code.insert(1, 'test', Include('test.yaml'), comment="new key")