我可以让PyYAML对一个流中的多个文档应用一个%TAG指令吗?

2024-10-05 11:07:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个YAML文件,比如:

%YAML 1.1
%TAG !x! tag:x.y,2013:
--- !x!1 &1
SomeThing:
  member: 1
--- !x!2 &2
OtherThing:
  inner: foo

我不确定它是否合规,但它是由一个我无法控制的程序生成的。在

我真的不想改变信仰标签:x.y,2013:1'到任何特定的类中,所以我尝试使用PyYAML的BasicLoader如下所示:

^{pr2}$

PyYAML在到达第二个文档时抛出异常。在

yaml.parser.ParserError: while parsing a node
found undefined tag handle '!x!'

有没有一种简单的方法可以告诉PyYAML完全忽略标记前缀,或者对流中的所有文档应用相同的%TAG指令?在


Tags: 文件文档程序yamlfootag标签something
1条回答
网友
1楼 · 发布于 2024-10-05 11:07:39

这绝对是格式错误的YAML YAML流中的每个文档都独立于前一个文档,并且可能对其设置了不同的指令。诚然,标准对此有点不清楚,尽管Section 9.2声明:“请注意[流中的]每个文档都独立于其他文档,允许异构日志文件条目。”

看起来Parser类有一个映射默认标记句柄的DEFAULT_TAGS属性:https://github.com/yaml/pyyaml/blob/master/lib/yaml/parser.py#L76

作为一种解决方法,您可以就地修改dict(Parser.DEFAULT_TAGS[u'!x!'] = u'tag:x.y,2013'),或者,也许更好的方法是将基Parser类的子类化,并创建自己的使用解析器的Loader类:

from yaml.parser import Parser
from yaml.reader import Reader
from yaml.scanner import Scanner
from yaml.composer import Composer
from yaml.constructor import Constructor
from yaml.resolver import Resolver

class MyWonkyParser(Parser):
    DEFAULT_TAGS = {u'!x!': u'tag:x.y,2013'}
    DEFAULT_TAGS.update(Parser.DEFAULT_TAGS)

class MyWonkyLoader(Reader, Scanner MyWonkyParser, Composer, Constructor, Resolver):
    def __init__(self, stream):
        Reader.__init__(self, stream)
        Scanner.__init__(self)
        MyWonkyParser.__init__(self)
        Composer.__init__(self)
        Constructor.__init__(self)
        Resolver.__init__(self)

使用方式如下:

^{pr2}$

相关问题 更多 >

    热门问题