首页 > 解决方案 > YAML:键的锚点?

问题描述

我可以在 YAML 中重复使用密钥而不重新键入它们吗?如果可以通过锚重复密钥,重命名此密钥将很简单。

splitTestVariants:
  lowCost: 0
  mediumCost: 1
  highCost: 2

pricePlans:
  # reuse lowCost key instead this comment without retyping it
    basic: 100
    premium: 200
    vip: 300
  # reuse mediumCost key instead this comment without retyping it
    basic: 200
    premium: 300
    vip: 400
  # reuse highCost instead this comment without retyping it
    basic: 300
    premium: 400
    vip: 500

标签: yaml

解决方案


当然可以使用锚和别名来减少打字:

import sys
import ruamel.yaml

yaml_str = """\
splitTestVariants:
  &l lowCost: 0
  &m mediumCost: 1
  &h highCost: 2

pricePlans:
  *l :
    basic: 100
    premium: 200
    vip: 300
  *m :
    basic: 200
    premium: 300
    vip: 400
  *h :
    basic: 300
    premium: 400
    vip: 500
"""

yaml = ruamel.yaml.YAML()
yaml.default_flow_style = False
data = yaml.load(yaml_str)
print(list(data['pricePlans'].keys()))

这使:

['lowCost', 'mediumCost', 'highCost']

以上是 YAML 的一个特性,而不是ruamel.yaml(我是作者)的一个特性。

请注意别名 ( *X) 和映射值指示符 ( :) 之间的空格。并非所有 YAML 解析器(包括指定 `YAML(typ='safe')' 时libyaml使用的 C 实现)都能正确解析 YAML 锚和别名,冒号可以是锚名称的一部分,因此空格(或换行符)是这里需要。ruamel.yaml


推荐阅读