如何在 PyYaml 中添加自定义嵌套标签?

How to add custom nested tags in PyYaml?

我希望能够使用嵌套标签

我使用下面的代码让自定义标签单独工作,但无法在相同的值中使用两者

SafeLoader.add_constructor("!include", include)
SafeLoader.add_constructor("!path", gen_path)

这就是我的示例 yaml 的样子

key: !include !path special_file.yaml

注:

!path => 从 mysql

进行一些处理后生成一个特殊路径

!include => 将文件的 yaml 内容加载到当前阅读数据中

你的是 shorthand 标签,如果你查看 YAML 1.1 规范中的生产规则,你会看到:

[112]   c-ns-shorthand-tag  ::=   ( c-primary-tag-handle ns-tag-char+ )
                                | ( ns-secondary-tag-handle ns-uri-char+ )
                                | ( c-named-tag-handle ns-uri-char+ )

该规则仅用于标签 属性:

[110]   c-ns-tag-property   ::=   c-verbatim-tag | c-ns-shorthand-tag
                                | c-ns-non-specific-tag

并且在节点属性中使用:

[107]   c-ns-properties(n,c)    ::=   ( c-ns-tag-property
                                      ( s-separate(n,c) c-ns-anchor-property )? )
                                    | ( c-ns-anchor-property
                                      ( s-separate(n,c) c-ns-tag-property )? )

如您所见,其中 none 包括标签元素本身的重复,仅针对标签 ( ns-tag-char+ ) 中的字符。

因此在 YAML 的单个节点上不能有多个标签。

PyYAML 部分实现的 YAML 1.1 规范在十多年前被 YAML 1.2 取代,但它具有相同的限制,因此它不会为您升级 YAML 解析器带来任何好处。