在一个串上“!” pyYAML错误(pyYAML Errors on “!” in a string

2019-07-03 15:56发布

首先,免责声明:我不是太熟悉YAML。 我试图解析YAML doc文档转成键值对(不要担心,我怎么做。我有一个位处理)

我的文件中使用到看起来像这样:

world:
     people:
          name:Suzy
          address:chez-bob

于是,有人走了,改变它。

world:
     people:
          name:!$uzy
          address:chez-bob

而我得到这个语法错误:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!$uzy'

这是什么意思,甚至? 我怎么会去得到它只是解释!$为只有两个字符? 我只想字符串键和值的字典! 此外,编辑YAML文件是不是一种选择。 问题必须固定在使用该分析器的代码。

Answer 1:

感叹号是YAML标签的前缀。 分析器具有由标签名来实现它的构造函数。 还有像一些默认标签!!bool!!int等,甚至像一些Python特定的标记!!python/tuple

您可以定义自己的构造函数,甚至构造由前缀抓住了多个标签。 通过定义前缀'' ,你可以捕捉所有的标签和忽略它们。 您可以从构造函数返回一个标签并将其值改为只把它所有的文本。

>>> import yaml
>>> def default_ctor(loader, tag_suffix, node):
...     print loader
...     print tag_suffix
...     print node
...     return tag_suffix + ' ' + node.value
...
>>> yaml.add_multi_constructor('', default_ctor)
>>> yaml.load(y)
<yaml.loader.Loader object at 0xb76ce8ec>
!$uzy
ScalarNode(tag=u'!$uzy', value=u'')
{'world': {'people': {'name': '!$uzy', 'address': 'chez-bob'}}}
>>>


Answer 2:

“!”如果值开头,你必须用单引号或双引号的价值; 否则它被解释为一个YAML标签。

world:
     people:
          name: "!$uzy"
          address: chez-bob


Answer 3:

这实际上是在PyYAML的错误。 它解释:name:!$uzy作为键/值分隔符,但只应该这样做,如果:后跟一个空格,或者如果前面的标量( name )被引用。 随访错误是感叹号,这应该在标量的中间被允许,被错误地解释为是在标量的开始,因此引入的标记。

关键的价值people是字符串name:!$uzy address:chez-bob和正确地在其他解析器(包括Python包处理ruamel.yaml其中我的作者)。



文章来源: pyYAML Errors on “!” in a string