Как начать распечатку ключей после новой строки в блоке - PullRequest
1 голос
/ 29 мая 2019

Используя встроенный в Python пакет yaml, можно ли выводить элементы списка, начинающиеся с новой строки после тире индикатора списка?

Вместо этой структуры:

root:
  - name: a
    id: 0
  - name: b
    id: 1

Мне нужна следующая структура:

root:
  -
    name: a
    id: 0
  -
    name: b
    id: 1

1 Ответ

0 голосов
/ 29 мая 2019

AFAIK PyYAML даже не поддерживает первый указанный вами вывод:

import sys
import yaml as pyyaml

data = dict(root=[dict(name="a", id=0), dict(name="b", id=1)])
pyyaml.safe_dump(data, sys.stdout, default_flow_style=False, indent=4)

, поскольку это дает:

root:
-   id: 0
    name: a
-   id: 1
    name: b

Как вы можете видеть индикатор элемента последовательности блоков (-) не смещается в пределах отступа элемента последовательности, и чтобы сделать это и / или получить дополнительную строку новой строки, вам необходимо изменить внутренние компоненты эмиттера PyYAML.

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

import sys
import ruamel.yaml

data = dict(root=[dict(name="a", id=0), dict(name="b", id=1)])

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.compact_seq_map = False

yaml.dump(data, sys.stdout)

, что дает:

root:
  -
    name: a
    id: 0
  -
    name: b
    id: 1

Кстати, я бы не назвал ни PyYAML, ни ruamel.yaml встроенными , что бы вы ни подразумевали под этим.Python имеет стандартную библиотеку (так как она поставляется с батарейками), которая, например, содержит анализатор JSON.Но в стандартной библиотеке нет синтаксического анализатора YAML.

...