Почему я получаю кавычки в выводе файла yaml, если я использую восклицательный знак?

1

Я создаю файл yaml с именем main.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
Теги:
yaml
ruamel.yaml

1 ответ

1

Мне не нужны котировки на выходе. Итак, как предотвратить появление котировок на выходе?

В YAML строки могут быть только без кавычек, если они не имеют другого значения. 124 - это число, а не строка. true является логическим, а не строковым. !foo обозначает тег, а не строку. Таким образом, если вы хотите, чтобы строка без кавычек начиналась с восклицательного знака, вам не повезло, вы не можете сделать это в 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")
  • 0
    Я подозреваю, что OP может хотеть иметь особое значение там и задается вопросом, как создать тег программно ...
  • 0
    @deceze: Вы можете быть правы; изм.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню