使用 YAML 合并键来交叉引用另一个 YAML 表中的行

    ---
    person_table:
      - &person001
        fname:  homer
        lname:  simpson
        role:   dad
        age:    33

      - &person002
        fname:  marge
        lname:  simpson
        role:   mom
        age:    34

      - &person003
        fname:  peter
        lname:  griffin
        role:   dad
        age:    34
        
    motto_table:
      - &motto001
        <<: *person001
        motto: >
          D'oh!! YAML is too complicated!

      - &motto002
        <<: *person002
        motto: >
          Bart! Listen to your father!

      - &motto003
        <<: *person003
        motto: >
          Hey! YAML is freakin' sweet!

问题

  • 开发人员希望从一个表交叉引用 rows-with-anchors,并在另一个表中使用 rows-as-aliases 链接到它们
  • 开发人员希望避免创建嵌套字典问题

  • 使用 YAML 别名,使用 YAML 合并键
  • 在 YAML 中,可重用的“transclusion 标识符”称为锚点和别名
  • 在 YAML 中,可重复使用的“transclusion 标识符”由字母数字标记组成,前面带有&符号或星号

合理

  • YAML 锚点和别名允许增加数据规范化
  • YAML 锚点和别名强制执行 DRY(不要重复自己)
  • 在这个例子中,可以设计和保存一个与数据库紧密相符的表结构
  • 在此示例中,可以减少数据输入和文件大小

陷阱

  • 在这个具体的例子中,yaml.load() 将生成嵌套的词典
    • 在人名 - 值对下,人的值将是子词典
    • 这可能是不希望的,因为它破坏了桌子结构的均匀性
  • 无法正确指定别名将导致数据丢失
    • (错别字会创建破损的交叉引用)
  • YAML 不支持通过引用进行文件转换,因此所有别名和锚点必须存在于同一 yaml 文件中
  • 并非所有 YAML 解析器都可靠地支持锚点和别名

也可以看看