Я хотел бы иметь возможность "изменить" существующие комментарии в документе yaml, чтобы они действовали при запуске yamllint
на произведенном выводе, конфигурация по умолчанию: min-spaces-from-content=2
(ref: https://yamllint.readthedocs.io/en/stable/rules.html#module -yamllint.rules.comments ).
Согласно Как добавить комментарий с помощью ruamel.yaml , использование чего-то вроде yaml_add_eol_comment('the comment', 'the key', column=None)
должно сработать, но это не так результат, который я получил до сих пор.
Вот фрагмент кода (использующий ruamel.yaml
в версии 0.16.7
), который я написал, чтобы продемонстрировать текущее поведение, которое у меня есть:
"""Play with comments."""
from __future__ import print_function
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
inp = """\
---
list-of-maps:
- part_no: A4786 # comment 1
part_henon: mouhaha # you're not funny
- part_yes: A21 # also a comment here
part_iculier: partenaire # I don't always understand how it works
part_third: key # komment
list-only:
- first # comment 2
- third # I have a comment too
- second # what?
simple-map:
what-are-you-waiting-for: christmas? # duke nukem rulez
jingle: bels # not christmas yet
map-of-maps:
key:
another-sub-key: w00t # casimir
sub-key: sub-value # comment 3
my-sub-key-name-is-longuer-than-yours: 1 # sentinel vs superman
"""
data = yaml.load(inp)
def process_comments(data, column=None):
if isinstance(data, dict):
if data.ca:
if data.ca.items:
for key in data.ca.items.keys():
if data.ca.items[key][2]:
comment = data.ca.items[key][2].value.replace("\n", "")
data.yaml_add_eol_comment(comment, key, column=column)
for k, v in data.items():
process_comments(k, column=column)
process_comments(v, column=column)
elif isinstance(data, list):
if data.ca:
if data.ca.items:
for key in data.ca.items.keys():
if data.ca.items[key][0]:
comment = data.ca.items[key][0].value.replace("\n", "")
data.yaml_add_eol_comment(comment, key, column=column)
for elem in data:
process_comments(elem, column=column)
process_comments(data, column=None)
yaml.dump(data, sys.stdout)
Ожидаемый вывод:
list-of-maps:
- part_no: A4786 # comment 1
part_henon: mouhaha # you're not funny
- part_yes: A21 # also a comment here
part_iculier: partenaire # I don't always understand how it works
part_third: key # komment
list-only:
- first # comment 2
- third # I have a comment too
- second # what?
simple-map:
what-are-you-waiting-for: christmas? # duke nukem rulez
jingle: bels # not christmas yet
map-of-maps:
key:
another-sub-key: w00t # casimir
sub-key: sub-value # comment 3
my-sub-key-name-is-longuer-than-yours: 1 # sentinel vs superman
Фактический вывод:
list-of-maps:
- part_no: A4786 # comment 1
part_henon: mouhaha # you're not funny
- part_yes: A21 # also a comment here
part_iculier: partenaire # I don't always understand how it works
part_third: key # komment
list-only:
- first # comment 2
- third # I have a comment too
- second # what?
simple-map:
what-are-you-waiting-for: christmas? # duke nukem rulez
jingle: bels # not christmas yet
map-of-maps:
key:
another-sub-key: w00t # casimir
sub-key: sub-value # comment 3
my-sub-key-name-is-longuer-than-yours: 1 # sentinel vs superman
Так что кажется:
- для CommentedMaps, комментарий поскольку первый ключ получает два пробела перед #, но не другие комментарии, связанные с другими ключами CommentedMap
- для CommentedSeqs, перед #
* 1031 всегда есть один пробел * Я что-то упустил?
Дополнительная информация:
Кстати, более простой пример дает тот же результат / поведение:
"""Test comments on a very simple CommentedMap."""
import sys
import ruamel.yaml
comment_column = None
insert = ruamel.yaml.comments.CommentedMap()
insert["test"] = "asdf"
insert.yaml_add_eol_comment("Test Comment!", "test", column=comment_column)
insert["second-key"] = "yop"
insert.yaml_add_eol_comment("Another comment", "second-key", column=comment_column)
yaml = ruamel.yaml.YAML()
yaml.dump(insert, sys.stdout)
выходы:
test: asdf # Test Comment!
second-key: yop # Another comment
Отказ от ответственности:
- большое спасибо большое спасибо автору
ruamel.yaml
, это потрясающая библиотека ... и спасибо за просмотр после SO вопросов о библиотеке - Я вовсе не претендую на звание хорошего python разработчика, поэтому, пожалуйста, прости мне, если мой код не хорошего качества