Как я могу добавить комментарий с ruamel.yaml - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь создать структуру данных с помощью ruamel.yaml и хочу добавить комментарии перед тем, как сбросить и / или загрузить ее снова. К сожалению, во всех примерах сначала загружается какая-то строка с помощью двустороннего дампера или используются более не существующие API.

Вот что я пытаюсь сбросить:

test: asdf # Test Comment!

Я попробовал следующее:

insert = ruamel.yaml.comments.CommentedMap()
start_mark = ruamel.yaml.error.CommentMark(0)
insert['test'] = 'asdf'
insert.ca.items['test'] = [ None,
    [ruamel.yaml.CommentToken(value='# Test Comment!', start_mark=start_mark, end_mark=None)],
    None,
    None
]
ruamel.yaml.round_trip_dump(insert, sys.stdout)

который печатает.

# Test Comment!test: asdf

Каким-то образом комментарий находится впереди, а не за значениями. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Вы можете попытаться сделать это, добавив CommentTokens, но Тип start_mark должен приходить с ruamel.yaml.error.

Гораздо проще сделать insert a CommentedMap (вот что отображение будет загружено как при выполнении обычной, двусторонней загрузки), и затем используйте его yaml_add_eol_comment метод:

import sys
import ruamel.yaml


insert = ruamel.yaml.comments.CommentedMap()
insert['test'] = 'asdf'
insert.yaml_add_eol_comment('Test Comment!', 'test', column=0)

yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
yaml.dump(insert, sys.stdout)

, что дает:

test: asdf # Test Comment!

column=0 необязательно. Если вы не укажете начальный столбец, вы получите два пробела, прежде чем #, 0 попытается вытолкнуть его полностью вперед, но, конечно, пара ключ-значение находится на пути.

Вы можете указать # в EOL комментарий, который вы указываете для метода yaml_add_eol_comment, но если это не там, это будет добавлено.

Если у вас есть несколько комментариев после нескольких ключей подряд и чтобы ваши комментарии были выровнены, вам нужно только указать добавлен столбец первого.

1 голос
/ 16 мая 2019

В отношении последних документов, https://yaml.readthedocs.io/en/latest/example.html

CommentedMap, который является dict -подобной конструкцией, которую получают при загрузке в оба конца, поддерживает вставку ключа в определенную позицию,при необязательном добавлении комментария:

import sys
from ruamel.yaml import YAML

yaml_str = """\
key: value # first line and comment!
"""

yaml = YAML()
data = yaml.load(yaml_str)
data.insert(1, 'test', 'asdf', comment="Test Comment!")
yaml.dump(data, sys.stdout)

Вывод:

key: value # first line and comment!
test: asdf # Test Comment!
...