Ошибка синтаксического анализа yaml с восклицательными знаками - PullRequest
0 голосов
/ 16 июня 2020

Попытка использовать pyyaml для анализа mkdocs.yml файла. Он содержит такой фрагмент:

foo:
    emoji_index: !!python/name:materialx.emoji.twemoji

Когда я запускаю:

with open("test.yml", 'r') as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Это вызывает следующую ошибку:

could not determine a constructor for the tag 'tag:yaml.org,2002:python/name:materialx.emoji.twemoji'
  in "test.yml", line 2, column 18

1 Ответ

1 голос
/ 16 июня 2020

safe_load ограничивает загрузчик загрузкой только известных ему типов. Это связано с тем, что загрузка произвольных типов может привести к выполнению произвольного кода, что представляет собой угрозу безопасности.

Чтобы правильно загрузить файл, у вас есть следующие параметры:

  • Использовать load вместо safe_load и импортируйте библиотеку, содержащую materialx.emoji.twemoji (я не уверен, где это определено, я не нашел однозначного ответа в Интернете)
  • Вместо загрузки файла YAML в собственные типы загрузите его в граф узлов, используя yaml.compose. Это вернет узел root документа YAML. Это не поместит узлы непосредственно в dict s, list s et c.
  • Зарегистрируйте собственный конструктор:
def my_constructor(loader, node):
  # since the content of the node is empty, you should return a value that
  # can be used to identify the node, e.g.
  return "materialx.emoji.twemoji"

yaml.add_constructor('tag:yaml.org,2002:python/name:materialx.emoji.twemoji',
    my_constructor, yaml.SafeLoader)

Какой подход лучше зависит от того, что вы хотите делать с данными.

...