получить комментарий во время итерации в ruamel.yaml - PullRequest
0 голосов
/ 27 августа 2018

Как получить комментарии, когда я перебираю объект 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)

1 Ответ

0 голосов
/ 27 августа 2018

Вы не указали свой ввод, но так как ваш код ожидает 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), но нет никаких гарантий, что это может не измениться.

...