Есть ли способ сбросить YAML в той же версии, в которой он был загружен с помощью ruamel.yaml?

Есть ли хороший способ с помощью ruamel.yaml выгрузить файл YAML в той же версии, в которой он загружен? Если у меня есть директива %YAML 1.1 в файле, я хотел бы иметь возможность выгрузить файл обратно в YAML 1.1 без необходимости жестко кодировать version='1.1'.

Итак, учитывая некоторые данные, например,

%YAML 1.1
---
is_string: 'on'
is_boolean: on

Я хотел бы избежать жесткого кодирования version='1.1' на round_trip_dump(),

x = f.read()
d = round_trip_load(x)
round_trip_dump(d, f, explicit_start=True)

person nnutter    schedule 28.12.2017    source источник


Ответы (1)


Версия файла YAML — это временное значение, которое сбрасывается после загрузки. Я планировал каким-то образом сделать версию последнего загруженного документа доступной, но с несколькими документами в потоке это требует дополнительных размышлений.

Для отдельных потоков документов вы можете сделать следующее, чтобы получить версию из директивы. Все это делается с помощью нового API. Со старым API, который вы используете в примере, то же самое возможно, но сложнее, потому что нет экземпляра YAML() для прикрепления атрибутов:

import sys
from ruamel.yaml import YAML
from ruamel.yaml.parser import Parser

yaml_str = """\
%YAML 1.1
---
is_string: 'on'
is_boolean: on
"""

class MyParser(Parser):
    def dispose(self):
        self.loader.last_yaml_version = self.yaml_version
        Parser.dispose(self)


yaml = YAML()
yaml.Parser = MyParser
data = yaml.load(yaml_str)

yaml2 = YAML()
yaml2.version = yaml.last_yaml_version
yaml2.dump(data, sys.stdout)

который дает:

%YAML 1.1
---
is_string: 'on'
is_boolean: true

Обратите внимание, что необходимо создать чистый новый объект для вывода, так как «неверсионное» чтение не полностью сбрасывает экземпляр yaml при встрече с директивой %YAML 1.1.

Также можно вывести значение, связанное с is_boolean, как on, но это повлияет на все логические значения в потоке.

person Anthon    schedule 28.12.2017