Ответ 1
Вместо этого используйте ruamel.yaml
.
Борьба с библиотекой! Сказка о двух библиотеках
PyYAML эффективно мертв и уже несколько лет. Что касается сложных вопросов, официальный проект дома в http://pyyaml.org, похоже, недавно был снят. На этом сайте размещен трекер, документация и загрузки PyYAML. На момент написания статьи все исчезло. Это не что иное, как бедствие. Добро пожаловать в другой день в open-source.
ruamel.yaml
поддерживается . В отличие от PyYAML, ruamel.yaml
поддерживает:
- YAML <= 1,2. PyYAML поддерживает только YAML <= 1.1. Это важно, так как YAML 1.2 намеренно прерывает обратную совместимость с YAML 1.1 в нескольких случаях. Обычно это плохо. В этом случае это делает YAML 1.2 строгим надмножеством JSON. Поскольку YAML 1.1 не является строгим надмножеством JSON, это хорошо.
- Сохранение в кавычках. При вызове
yaml.dump()
для дампа словаря, загруженного предыдущим вызовом, вyaml.load()
:- PyYAML наивно игнорирует все форматирование ввода - включая комментарии, заказы, цитаты и пробелы. Отброшено, как и многие цифровые отходы, в ближайшее доступное ведро бит.
-
ruamel.yaml
умело уважает все форматирование ввода. Все. Вся стилистическая энчилада. Весь литературный шебанг. Все.
Миграция библиотеки: следы следов кода
Так как ruamel.yaml
является файлом PyYAML и, следовательно, соответствует API PyYAML, переход с PyYAML на ruamel.yaml
в существующих приложениях обычно такой же простой, как и замена всех экземпляров этого:
# This imports PyYAML. Stop doing this.
import yaml
... с этим:
# This imports "ruamel.yaml". Always do this.
from ruamel import yaml
Что это.
Никаких других изменений не требуется. Функции yaml.load()
и yaml.dump()
должны продолжать вести себя так, как ожидалось, с дополнительными преимуществами теперь поддерживая YAML 1.2 и активно получая исправления ошибок.
Сохранение заворота и то, что он может сделать для вас
Для обратной совместимости с PyYaml функции yaml.load()
и yaml.dump()
по умолчанию не поддерживают сохранение в обратном направлении. Для этого явно передайте:
- Необязательный параметр ключевого слова
Loader=ruamel.yaml.RoundTripLoader
дляyaml.load()
. - Необязательный параметр
Dumper=ruamel.yaml.RoundTripDumper
для ключевого словаyaml.dump()
.
Пример любезно "заимствован" из ruamel.yaml
documentation:
import ruamel.yaml
inp = """\
# example
name:
# Yet another Great Duke of Hell. He not so bad, really.
family: TheMighty
given: Ashtaroth
"""
code = ruamel.yaml.load(inp, Loader=ruamel.yaml.RoundTripLoader)
code['name']['given'] = 'Astarte' # Oh no you didn't.
print(ruamel.yaml.dump(code, Dumper=ruamel.yaml.RoundTripDumper), end='')
Сделано. Комментарии, упорядочение, цитирование и пробелы теперь будут сохранены.
TL;DR
Всегда используйте ruamel.yaml
. Никогда не используйте PyYAML. ruamel.yaml
живет. PyYAML - это зловонный труп, гниющий на измельченном землетрясении PyPi.
Долго жить ruamel.yaml
.