Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将函数调用应用于别名?_Python_Yaml_Pyyaml - Fatal编程技术网

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

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文件:

%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]