首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将函数调用应用于别名?

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

Stack Overflow用户
提问于 2014-04-12 12:39:55
回答 1查看 2.1K关注 0票数 0

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

代码语言:javascript
运行
复制
%YAML 1.1
---
- fruit: &fruitref { type: banana, color: yellow }
- another_fruit: !rotten *fruitref

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

备注

在我看来,由于以下错误,构造!标记*别名无效:

代码语言:javascript
运行
复制
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]似乎都能工作,但我想知道如果可能的话,如何省略方括号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-28 10:05:16

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

代码语言:javascript
运行
复制
!tag *reference

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

代码语言:javascript
运行
复制
!prefix!suffix [*reference]

代码语言:javascript
运行
复制
!tag [*reference]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23030499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档