【问题标题】:YAML key consisting of a list of elements由元素列表组成的 YAML 键
【发布时间】:2016-09-15 09:30:37
【问题描述】:

我需要一个元素列表作为键,这样我就可以检查是否满足多个条件。 示例(不知道这是否可行以及语法是否正确):

mapping:
  c_id:
    [pak, gb]: '4711'
    [pak, ch]: '4712'
    [pak]: '4713'
  d_id:
    .
    .
    .

现在我需要知道是否可以采用示例中的方法。

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    除了 Anthon 的回答之外,以下是使用 PyYaml 的方法:

    mapping:
      c_id:
        !!python/tuple [pak, gb]: '4711'
        !!python/tuple [pak, ch]: '4712'
        !!python/tuple [pak]: '4713'
    

    诀窍是告诉 PyYaml 您要将键加载到元组中(因为列表不能用作 dict 键)。没有办法隐式做到这一点,但这并不意味着不可能。

    在这种情况下,显式键可能更具可读性:

    mapping:
      c_id:
        ? !!python/tuple [pak, gb]
        : '4711'
        ? !!python/tuple [pak, ch]
        : '4712'
        ? !!python/tuple [pak]
        : '4713'
    

    这个例子在语义上等同于第一个例子。

    【讨论】:

    • 保存了我的问题,无需从 PyYAML 更改为任何其他模块,谢谢!
    【解决方案2】:

    您的 YAML 的语法是正确的。唯一的技巧是,因为在 Python 中,键必须是不可变的,所以您需要将对复杂键的访问指定为元组:

    import ruamel.yaml
    
    yaml_str = """\
    mapping:
      c_id:
        [pak, gb]: '4711'
        [pak, ch]: '4712'
        [pak]: '4713'
    """
    
    data = ruamel.yaml.round_trip_load(yaml_str)
    print(data['mapping']['c_id'][('pak', 'gb')])
    

    给予:

    4711
    

    请注意,PyYAML 无法做到这一点,因为它不支持将序列作为键,您必须使用 ruamel.yaml(免责声明:我是该软件包的作者)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-12
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2018-10-29
      • 2021-12-14
      相关资源
      最近更新 更多