【问题标题】:Error parsing yaml with exclamation marks使用感叹号解析 yaml 时出错
【发布时间】:2023-03-19 04:55:01
【问题描述】:

尝试使用pyyaml 解析mkdocs.yml 文件。它包含一个像这样的 sn-p:

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

【问题讨论】:

    标签: python yaml pyyaml mkdocs


    【解决方案1】:

    safe_load 限制加载器只加载它知道的类型。这是因为加载任意类型会导致任意代码执行,这是一个安全风险。

    要正确加载文件,您有以下选择:

    • 使用load而不是safe_load并导入包含materialx.emoji.twemoji的库(我不确定这是在哪里定义的,我在网上没有找到明确的答案)
    • 不要将 YAML 文件加载到本机类型,而是使用 yaml.compose 将其加载到节点图中。这将返回 YAML 文档的根节点。这不会将节点直接放入dicts、lists 等。
    • 注册一个自己的构造函数:
    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)
    

    哪种方法最好取决于您要对数据做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多