在 Perl 中,我可以执行以下操作:
my $home = "/home";
my $alice = "$home/alice";
我可以在 YAML 中执行以下操作:
Home: /home
Alice: $Home/alice
那么《爱丽丝》/home/alice
到底有效吗?
在 Perl 中,我可以执行以下操作:
my $home = "/home";
my $alice = "$home/alice";
我可以在 YAML 中执行以下操作:
Home: /home
Alice: $Home/alice
那么《爱丽丝》/home/alice
到底有效吗?
不幸的是,你运气不好。要执行您想要的操作,您需要$home
从视图文件(或任何地方)传入并将其插入到您的 yaml 条目中,这可能看起来像:
Alice: ! '%{home}/Alice'
有关您的问题的详细答案,请参阅此 StackOverflow Q&A 。
您应该使用 ERB 模板。
你可以这样写:
Alice: <%=home%>/alice
使用时需要home
先用 ERB 解析值,然后解析为 YAML。如果 home 是局部变量,则需要将局部绑定作为#result 方法的参数传入。如果你没有通过这个,将默认使用 TOP LEVEL 绑定。
像这样:
require 'erb'
home = 'home'
YAML.load(ERB.new(yaml_content).result(binding))
我最近也在为 Python 寻找这个,并dynamic-yaml
通过 Github 上的 Awesome YAML 存储库偶然发现了这个包。
链接 Awesome YAML Github 存储库:https ://github.com/dreftymac/awesome-yaml#parsers 链接 Python 的动态 YAML:https ://github.com/childsish/dynamic-yaml
希望这可以帮助!
编辑:由于评论是正确的,链接可能会中断,这里是一个简单的例子:
如果您有一个如下所示的 YAML 文件:
house:
street: cool_street_name
number: 45
street_and_number: {house.street}-{house.number}
安装 dynamic_yamlpython -m pip install 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
我最终使用了,YAML::AppConfig
但我承认这不是 YAML 解决方案,而是 Perl 特定的解决方案。它允许 YAML 包含$var
被插值的 s。
使用Yglu,您可以这样编写示例:
Home: /home
Alice: !? .Home + '/alice'
或者
Home: /home
Alice: !? ('{0}/alice').format($_.Home)
免责声明:我是 Yglu 的作者。