YAML键由一系列元素组成

时间:2016-09-15 09:30:37

标签: python yaml pyyaml

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

Exception

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

2 个答案:

答案 0 :(得分:3)

除了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'

此示例在语义上等同于第一个示例。

答案 1 :(得分: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(免责声明:我是该程序包的作者)

相关问题