получить комментарий во время итерации в ruamel.yaml

1

Как я могу получить комментарии, когда я перебираю объект YAML

yaml = YAML()

with open(path, 'r') as f:
    yaml_data = yaml.load(f)

for obj in yaml_data:
    # how to get the comments here?

Это исходные данные (незанятая пьеса)

---
- name: gather all complex custom facts using the custom module
  hosts: switches
  gather_facts: False
  connection: local
  tasks:
    # There is a bug in ansible 2.4.1 which prevents it loading
    # playbook/group_vars
    - name: ensure we're running a known working version
      assert:
        that:
          - 'ansible_version.major == 2'
          - 'ansible_version.minor == 4'

После комментариев Anthon, именно так я нашел доступ к комментариям в дочерних узлах (необходимо уточнить):

for idx, obj in enumerate(yaml_data):
    for i, item in enumerate(obj.items()):
        pprint(yaml_data[i].ca.items)
  • 0
    В следующий раз, пожалуйста, пропустите благодарности, но включите полный пример, включая некоторые реальные данные YAML (с комментариями), чтобы нам не приходилось догадываться, как выглядит ваш вклад.
Теги:
yaml
ruamel.yaml

1 ответ

0
Лучший ответ

Вы не указали свой ввод, но поскольку ваш код ожидает obj а не ключ, я предполагаю, что корневой уровень вашего YAML является последовательностью, а не сопоставлением. Если вы хотите получить комментарии после каждого элемента (например, nr 1 и the last), вы можете сделать:

import ruamel.yaml

yaml_str = """\
- one  # nr 1
- two 
- three # the last
"""

yaml = ruamel.yaml.YAML()

data = yaml.load(yaml_str)

for idx, obj in enumerate(data):
    comment_token = data.ca.items.get(idx)
    if comment_token is None:
        continue
    print(repr(comment_token[0].value))

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

'# nr 1\n'
'# the last\n'

Вам может понадобиться полоса ведущего октоторпа и конечная новая линия.

Обратите внимание, что это работает с текущей версией (0.15.61), но нет гарантии, что она не может измениться.

  • 0
    Я добавил исходный файл yaml. С вашим кодом я не могу получить комментарии
  • 0
    Это потому, что комментарии не относятся к структуре данных корневого уровня. Я до сих пор понятия не имею, какой результат вы ожидаете, или что вы хотите с этим делать. Вы просто хотите получить дамп всех комментариев в порядке их появления в документе YAML?
Показать ещё 4 комментария

Ещё вопросы

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