在yaml中使用占位符

在yaml中使用占位符,yaml,computed-properties,indirection,template-variables,Yaml,Computed Properties,Indirection,Template Variables,有没有一种方法可以像这样在yaml中使用占位符: foo: &FOO <<propname>>: type: number default: <<default>> bar: - *FOO propname: "some_prop" default: "some default" foo:&foo : 类型:编号 违约: 酒吧: -*富 道具名称:“一

有没有一种方法可以像这样在yaml中使用占位符:

foo: &FOO
    <<propname>>: 
        type: number 
        default: <<default>>

bar:
    - *FOO 
       propname: "some_prop"
       default: "some default" 
foo:&foo
: 
类型:编号
违约:
酒吧:
-*富
道具名称:“一些道具”
默认值:“一些默认值”
Context
  • YAML版本1.2
  • 用户希望
    • 在YAML中包含变量占位符
    • yaml.load
    • 能够为YAML映射键和值使用占位符
问题
  • YAML本机不支持变量占位符
  • 锚定和别名几乎提供了所需的功能,但它们不能作为变量占位符,而变量占位符可以插入整个YAML文本的任意区域。它们必须作为单独的YAML节点放置
  • 有些附加库支持任意变量占位符,但它们不是本机YAML规范的一部分
例子 考虑下面的YAML示例。它是格式良好的YAML语法,但是它使用(非标准)花括号占位符和嵌入表达式

嵌入表达式不会在YAML中产生所需的结果,因为它们不是本机YAML规范的一部分。然而,在本例中使用它们只是为了帮助说明标准YAML可用的内容和不可用的内容

part01\u客户信息:
客户名称:“荷马”
客户名称:“辛普森”
顾客座右铭:“我喜欢甜甜圈!”
客户电邮:homer@himpson.org
第01部分政府信息:
政府销售税税率:1.15
第01部分采购信息:
prch_单位标签:“培根包的花式釉面甜甜圈”
价格单位:3.00
采购单位数量:7
产品成本:{{PRCHU单价*PRCHU单价}”
总成本:{{PRCHU产品成本*政府销售税}”
第02部分装运信息:
客户名称:{{cust\u fname}”
客户名称:“{{cust\u lname}”
城市:休斯顿
船舶状态:Hexas
第03部分\u电子邮件\u信息:
客户电子邮件:“{{cust_email}”
邮件主题:谢谢你点的甜甜圈!
邮购须知:|
我们希望mail_问候语具有所有预期值
使用填充的占位符(而不是大括号)。
邮寄问候语:|
你好{{cust_fname}{{cust_lname}}!
我们喜欢你的座右铭“{{cust_座右铭}}”,我们同意你的观点!
您的总购买价格为{prch_total_cost}
解释
  • 下面是一个内联图像,用绿色、黄色和红色的彩色区域演示了该示例

  • 绿色标记的替换在标准YAML中很容易获得,使用锚、别名和

  • 黄色标记的替代物在技术上可在标准YAML中获得,但不能没有a或其他某种结合机制

  • 标为红色的替代品在标准YAML中不可用。但也有变通办法和替代方案;例如通过或字符串模板引擎(例如python的
    str.format

细节 YAML的一个常见功能是能够插入任意变量占位符,这些占位符支持与同一(或)YAML文件中的其他内容相关的任意交叉引用和表达式

YAML支持定位点和别名,但此功能不支持在YAML文本中任意位置放置占位符和表达式。它们仅适用于YAML节点

YAML还支持s,但是这些不太常见,如果您接受来自潜在不受信任来源的YAML内容,则存在安全隐患

YAML插件库 有YAML扩展库,但它们不是本机YAML规范的一部分

  • 安西布尔
    • (支持对YAML的许多扩展,但它是一个编排工具,如果您只想使用YAML,那就太过分了)
权变措施
  • 将YAML与模板系统(如Jinja2或Twig)结合使用
  • 使用YAML扩展库
  • 使用托管语言中的
    sprintf
    str.format
    样式功能
选择
  • 本质上是YAML的一个分支,具有可能更接近OP中指定目标的附加特性
  • 与YAML有一些相似之处,但有更多的特性,可能更接近OP中指定的目标
另见 在这里
外面这么
我认为这是解决您问题的一个可接受的解决方案

使用结构模板,您的示例可以写成:

foo: !()
  !? $.propname: 
     type: number 
     default: !? $.default

bar:
  !apply .foo: 
    propname: "some_prop"
    default: "some default"

免责声明:我是作者或Yglu。

另请参阅:可能重复的伟大答案,非常详细和解释,谢谢!不幸的是,用绿色标记的不适用于Jekyll用户,至少在JekyllV3.8.5上不适用。我对自己进行了测试。对Jekyll有效的是
&hello
(别名)和
*hello
(锚定),如下所述: