如何将函数调用应用于别名?

2024-05-14 16:51:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是允许一种简单的方法来“过滤”先前定义的节点。考虑一下这个虚构的YAML文件:

%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref

为了调用一个以*fruitref(即先前定义的对象,在本例中是map)作为参数的自定义函数并获取返回值,我需要在YAML文件或解析该文件的Python代码中定义什么?目标是简单而简洁的语法,用于“过滤”先前定义的值(map、sequence等等)。在

注意

在我看来,构造!标记*alias是无效的YAML,原因如下:

^{pr2}$

这很可能意味着我将无法实现所需的语法,但我确实关心简洁性(或者更确切地说,目标用户会这样做)。在

采取的路线

山药:!!python/object/apply:__main__.rotten [*fruitref]

它可以工作,但对于预期用途来说太冗长了;而且不需要多个参数,用例是始终别名的过滤器(以前定义的map/sequence/object)。在

山药:%TAG !f! !!python/object/apply:__main__.

也许!f!rotten [*fruitref]可以接受,但是我找不到如何使用%TAG指令。
编辑:我发现!!不适用于pyyaml3.10,它必须是这样的完整URL:%TAG !f! %TAG !f! tag:yaml.org,2002:python/object/apply:__main__.

Python:yaml.add_constructor

我已经使用add_constructor将映射“强制转换”到类的特定实例;警告是标记别名似乎是无效的YAML。在

目前为止最好的

Python中的add_constructor('!rotten', filter_rotten)和YAML中的!rotten [*fruitref]似乎可以工作,但我想知道如果可能,如何省略方括号。在


Tags: 文件addyamlmap目标参数定义object
1条回答
网友
1楼 · 发布于 2024-05-14 16:51:42

似乎不可能将标记应用于已标记的引用,因此:

!tag *reference

不可接受。最好的解决方案是将引用括在方括号中(创建一个序列),并使标记成为一个函数调用或一个期望一个对象序列的特殊构造函数,因此可用的最简洁语法是:

^{pr2}$

或者

!tag [*reference]

相关问题 更多 >

    热门问题