我的目标是允许一种简单的方法来“过滤”以前定义的节点。考虑一下这个虚构的YAML文件:
%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref
我需要在解析该文件的YAML文件或Python代码中定义什么,以便以*fruitref
(即前面定义的对象,在本例中是映射)作为参数调用自定义函数并获得返回值?目标是简单而简洁的语法,用于“过滤”先前定义的值(映射、序列等)。
备注
在我看来,由于以下错误,构造!
标记*
别名无效:
expected <block end>, but found '<alias>'
in "/tmp/test.yaml", line 4, column 21
这很可能意味着我无法实现所需的语法,但我确实关心简洁(或者更确切地说,目标用户会这么做)。
已采取的路线
YAML:!!python/object/apply:__main__.rotten [*fruitref]
它可以工作,但对于预期的用途来说过于冗长;而且不需要多个参数,用例是总是--别名的筛选器(以前定义的映射/序列/对象)。
YAML:%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__.
Python:yaml.add_constructor
我已经使用add_constructor
来“将”映射到类的特定实例;警告是标记别名似乎是无效的。
迄今为止最好的
Python中的add_constructor('!rotten', filter_rotten)
和YAML中的!rotten [*fruitref]
似乎都能工作,但我想知道如果可能的话,如何省略方括号。
发布于 2014-04-28 10:05:16
似乎不可能将标记应用于已经标记的引用,因此:
!tag *reference
是不可接受的。最好的解决方案是将对方括号(创建序列)的引用括起来,并使标记成为函数调用或期望一个对象序列的特殊构造函数,因此可用的最简洁的语法是:
!prefix!suffix [*reference]
或
!tag [*reference]
https://stackoverflow.com/questions/23030499
复制相似问题