Python 如何将函数调用应用于别名?
我的目标是提供一种简单的方法来“过滤”先前定义的节点。考虑这个虚构的YAML文件:Python 如何将函数调用应用于别名?,python,yaml,pyyaml,Python,Yaml,Pyyaml,我的目标是提供一种简单的方法来“过滤”先前定义的节点。考虑这个虚构的YAML文件: %YAML 1.1 --- - fruit: &fruitref { type: banana, color: yellow } - another_fruit: !rotten *fruitref 我需要在YAML文件或解析此文件的Python代码中定义什么,以便调用带有*fruitref(即先前定义的对象,在本例中为映射)作为参数的自定义函数并获取返回值?目标是简单而简洁的语法,用于“过滤”先前定义
%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref
我需要在YAML文件或解析此文件的Python代码中定义什么,以便调用带有*fruitref
(即先前定义的对象,在本例中为映射)作为参数的自定义函数并获取返回值?目标是简单而简洁的语法,用于“过滤”先前定义的值(映射、序列等)
注
在我看来,构造由于以下错误,代码>标记*
别名YAML无效:
expected <block end>, but found '<alias>'
in "/tmp/test.yaml", line 4, column 21
应为,但找到“”
在“/tmp/test.yaml”中,第4行第21列
这很可能意味着我无法实现所需的语法,但我确实关心简洁性(或者说,目标用户会)
采取的路线
YAML:!!python/object/apply:\uuuuu main\uuuuu.rotter[*fruitref]
它可以工作,但对于预期用途来说过于冗长;而且不需要多个参数,用例是始终别名(先前定义的映射/序列/对象)的过滤器
YAML:%标记!Fpython/object/apply:\uuuuu main\uuuu.
也许!F腐烂的[*FROUTREF]
是可以接受的,但我找不到如何使用%TAG
指令。
编辑:我发现
不适用于Pyyaml3.10,它必须是完整的URL,如下所示:%TAG!f!%标签!Ftag:yaml.org,2002:python/object/apply:\uuuu main\uuuu.
Python:yaml.add\u构造函数
我已经使用add_constructor
将映射“强制”到我的类的特定实例;需要注意的是,标记别名似乎是无效的YAML
目前为止最好的
在Python和中添加构造函数(“!rotter”,filter\u rotter)
!YAML中的rotter[*fruitref]
似乎很有效,但我想知道如果可能的话如何省略方括号。似乎不可能将标记应用于已标记的引用,因此:
!tag *reference
这是不可接受的。最好的解决方案是将引用括在方括号内(创建一个序列),并将标记设置为函数调用或期望一个对象序列的特殊构造函数,因此最简洁的语法是:
!prefix!suffix [*reference]
或
我正在选择我自己的答案。我有同样的问题,我尝试应用一个自定义标记!rand
到别名(一个序列
别名)-当我将别名放在括号中时,它将解析为一个空列表。
!tag [*reference]