首先,免责声明:我不是太熟悉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文件是不是一种选择。 问题必须固定在使用该分析器的代码。
感叹号是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'}}}
>>>
“!”如果值开头,你必须用单引号或双引号的价值; 否则它被解释为一个YAML标签。
world:
people:
name: "!$uzy"
address: chez-bob
这实际上是在PyYAML的错误。 它解释:
在name:!$uzy
作为键/值分隔符,但只应该这样做,如果:
后跟一个空格,或者如果前面的标量( name
)被引用。 随访错误是感叹号,这应该在标量的中间被允许,被错误地解释为是在标量的开始,因此引入的标记。
关键的价值people
是字符串name:!$uzy address:chez-bob
和正确地在其他解析器(包括Python包处理ruamel.yaml
其中我的作者)。