我的目标是提供一种简单的方法来“过滤”先前定义的节点。考虑一下这个虚构的YAML文件:
%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref
我需要在YAML文件或解析该文件的Python代码中定义什么,以便使用*fruitref
(例如,先前定义的对象,在这种情况下为map)作为参数来调用自定义函数并获取返回值?目标非常简单,语法简洁,可以“过滤”先前定义的值(映射,序列等)。
在我看来,由于错误,构造!
标记 *
别名是无效的YAML:
expected <block end>, but found '<alias>'
in "/tmp/test.yaml", line 4, column 21
这很可能暗示我将无法实现所需的语法,但我确实关心简洁性(或者,目标用户可以做到)。
!!python/object/apply:__main__.rotten [*fruitref]
它可以工作,但是对于预期的用途来说太冗长了;并且不需要多个参数,用例始终是别名(先前定义的映射/序列/对象)的过滤器。
%TAG !f! !!python/object/apply:__main__.
也许!f!rotten [*fruitref]
可以接受,但是我找不到如何使用该%TAG
指令。
编辑:我发现!!
对于PyYAML 3.10不起作用,它必须是完整的URL,如下所示:%TAG !f! %TAG !f! tag:yaml.org,2002:python/object/apply:__main__.
yaml.add_constructor
我已经使用add_constructor
“广播”映射到类的特定实例。需要注意的是,标记别名似乎是无效的YAML。
add_constructor('!rotten', filter_rotten)
在Python和!rotten [*fruitref]
YAML中似乎可以正常工作,但是我想知道如何在可能的情况下省略方括号。
似乎不可能将标签应用于已加标签的引用,因此:
!tag *reference
是不能接受的。最好的解决方案是将引用括在方括号中(创建序列),并使标记成为函数调用或期望构造一个对象序列的特殊构造函数,因此可用的最差语法为:
!prefix!suffix [*reference]
或者
!tag [*reference]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句