ruamel.yaml (заявление об отказе: я являюсь автором этого пакета) имеет эту встроенную функцию, поскольку необходимо поддерживать ее способность выполнять обратную передачу (загружать, изменять, выгружать) данные YAML без внесения ложных изменений,Кроме того, по умолчанию используется YAML 1.2, тогда как PyYAML поддерживает только YAML 1.1 (устаревший более 10 лет назад).
import sys
import ruamel.yaml
data = [{'item': 'Food_eat', 'Food': {'foodNo': 42536216,'type': 'fruit','moreInfo': ['organic']}}]
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.dump(data, sys.stdout)
, что дает:
- item: Food_eat
Food:
foodNo: 42536216
type: fruit
moreInfo:
- organic
Это зависит от современногоСпособность Python сохранять порядок вставки слова. В более старых версиях, таких как Python 2.7, вам придется явно создать объект CommentedMap
(импортированный из ruamel.yaml.comments
) и либо предоставить ему список кортежей (в правильном порядке), либо назначить пары ключ-значение вПорядок, в котором вы хотите, чтобы они были выгружены.
Как вы можете видеть в пределах отступа последовательности, у дефиса есть смещение, это то, чего вы не можете достичь с помощью PyYAML без переписывания своего эмиттера.
В PyYAML вы не хотите делать print(yaml.safe_dump(data))
, поскольку это неэффективно как в отношении памяти, так и времени, всегда используйте вместо него yaml.safe_dump(data, sys.stdout)
.