【问题标题】:String interpolation in YAMLYAML 中的字符串插值
【发布时间】:2013-03-24 13:35:42
【问题描述】:
在 Perl 中,我可以执行以下操作:
my $home = "/home";
my $alice = "$home/alice";
我可以在 YAML 中执行以下操作吗:
Home: /home
Alice: $Home/alice
所以“爱丽丝”到底是/home/alice?
【问题讨论】:
标签:
yaml
string-interpolation
template-variables
【解决方案1】:
很遗憾,你运气不好。要执行您想要的操作,您需要从视图文件(或任何位置)传入 $home 并将其插入到您的 yaml 条目中,这可能看起来像:
Alice: ! '%{home}/Alice'
请参阅this StackOverflow Q&A 以获得几乎完全是您的问题的详细答案。
【解决方案2】:
你应该使用 ERB 模板。
你可以这样写:
Alice: <%=home%>/alice
使用时需要先用ERB解析home值,然后解析为YAML。
如果 home 是局部变量,则需要将局部绑定作为 #result 方法的参数传入。
如果你没有通过这个,将默认使用 TOP LEVEL 绑定。
像这样:
require 'erb'
home = 'home'
YAML.load(ERB.new(yaml_content).result(binding))
【解决方案3】:
我最近也在为 Python 寻找这个,并通过 Github 上的 Awesome YAML 存储库偶然发现了 dynamic-yaml 包。
链接 Awesome YAML Github 仓库:https://github.com/dreftymac/awesome-yaml#parsers
链接 Python 的动态 YAML:https://github.com/childsish/dynamic-yaml
希望这会有所帮助!
编辑:由于 cmets 是正确的并且链接可能会断开,因此这里是一个简单的示例:
如果您有一个如下所示的 YAML 文件:
house:
street: cool_street_name
number: 45
street_and_number: {house.street}-{house.number}
使用python -m pip install dynamic_yaml 安装dynamic_yaml 以运行以下脚本。
import dynamic_yaml
with open(path_to_yaml_file, 'r') as f:
data = dynamic_yaml.load(f)
然后你会得到:
print(data['house']['street_and_number'])
>> cool_street_name-45
【讨论】:
-
点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们将来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留指向原始解决方案网站的链接引用。见:How do I write a good answer?
【解决方案4】:
我最终使用了YAML::AppConfig,但不可否认,这不是 YAML 解决方案,而是 Perl 特定的解决方案。它允许 YAML 包含被插值的$vars。
【解决方案5】:
使用Yglu,您可以这样编写示例:
Home: /home
Alice: !? .Home + '/alice'
或
Home: /home
Alice: !? ('{0}/alice').format($_.Home)
免责声明:我是 Yglu 的作者。