以下YAML引用如何覆盖前面的引用?

以下YAML引用如何覆盖前面的引用?,yaml,Yaml,但是结果并没有达到我的预期,我希望合并对象中的最后一个结果是 { merge: [ { x: 1, y: 1, r: 1 }, { x: 2, y: 2, r: 2 }, { x: 3, y: 3, r: 3 }, { x: 1, y: 2, r: 2, label: 'big/left/small' } ] } 如何使用YAML语法?使用YAML语法无法做到这一点,您的期望在多个层面上都是毫无

但是结果并没有达到我的预期,我希望合并对象中的最后一个结果是

{
    merge:
    [
         { x: 1, y: 1, r: 1 },
         { x: 2, y: 2, r: 2 },
         { x: 3, y: 3, r: 3 },
         { x: 1, y: 2, r: 2, label: 'big/left/small' } 
    ] 
}

如何使用YAML语法?

使用YAML语法无法做到这一点,您的期望在多个层面上都是毫无根据的

  • 被锚定元素(无论是否为序列元素)在合并别名或任何其他别名中使用时,也不会因为它是锚定元素而神奇地消失
  • 顶级映射键(
    merge
    )不会神奇地消失,因为它的值是一个序列标量,包含一个带有合并指示符的元素
  • 文档中没有指出这样的删除,YAML规范也没有。根据YAML规范,锚(和别名)通常不会以加载YAML时使用的语言保留在表示中。因此,通常不可能找到锚固构件,并在加载后将其删除

    一个通用的解决方案是使用另一个顶级键
    default
    键“定义”锚点,并仅使用与
    合并
    键关联的值:

    { x: 1, y: 3, r: 3, label: 'big/left/small' }.
    

    (输出中键的顺序当然是随机的)

    使用YAML语法无法做到这一点,您的期望在多个层面上都是毫无根据的

  • 被锚定元素(无论是否为序列元素)在合并别名或任何其他别名中使用时,也不会因为它是锚定元素而神奇地消失
  • 顶级映射键(
    merge
    )不会神奇地消失,因为它的值是一个序列标量,包含一个带有合并指示符的元素
  • 文档中没有指出这样的删除,YAML规范也没有。根据YAML规范,锚(和别名)通常不会以加载YAML时使用的语言保留在表示中。因此,通常不可能找到锚固构件,并在加载后将其删除

    一个通用的解决方案是使用另一个顶级键
    default
    键“定义”锚点,并仅使用与
    合并
    键关联的值:

    { x: 1, y: 3, r: 3, label: 'big/left/small' }.
    
    (输出中键的顺序当然是随机的)

    import ruamel.yaml
    
    yaml_str = """\
    default:
      - &LEFT { x: 1, y: 1, r: 1 }
      - &BIG { x: 2, y: 2, r: 2 }
      - &SMALL { x: 3, y: 3, r: 3}
    
    merge:
      # Override
      << : [ *BIG, *LEFT, *SMALL ]
      x: 1
      label: big/left/small
    """
    
    data = ruamel.yaml.load(yaml_str)['merge']
    print(data)
    
    {'x': 1, 'r': 2, 'y': 2, 'label': 'big/left/small'}