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

问题

  • 开发人员希望在YAML中表达一个表结构,其中每一行都由一个紧凑的行标识符引用

  • 使用YAML锚点,通过为表中的每一行分配锚点标识符
  • 在YAML中,可重用的“transclusion标识符”称为锚点和别名
  • 在YAML中,可重复使用的“transclusion标识符”由字母数字标记组成,前面带有&符号或星号

合理

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

陷阱

  • 必须先声明YAML锚点,然后才能通过别名引用它们
  • YAML锚点在整个文档中必须是唯一的
  • 未能指定唯一锚点将导致yaml.load()上的错误
  • 并非所有YAML解析器都可靠地支持锚点和别名

也可以看看

Stackoverflow YAML

使用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
        person:   *person001
        motto: >
          D'oh!! YAML is too complicated!

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

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

问题

  • 开发人员希望从一个表交叉引用rows-with-anchors,并在另一个表中使用rows-as-aliases链接到它们

  • 使用YAML别名,它交叉引用另一个表中的预定义锚点
  • 在YAML中,可重用的“transclusion标识符”称为锚点和别名
  • 在YAML中,可重复使用的“transclusion标识符”由字母数字标记组成,前面带有&符号或星号

合理

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

陷阱

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

也可以看看

Stackoverflow YAML

使用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解析器都可靠地支持锚点和别名

也可以看看