由元素列表组成的 YAML 密钥
YAML key consisting of a list of elements
我需要一个元素列表作为键,这样我就可以检查是否满足几个条件。
示例(不知道这是否可行以及语法是否正确):
mapping:
c_id:
[pak, gb]: '4711'
[pak, ch]: '4712'
[pak]: '4713'
d_id:
.
.
.
现在我需要知道是否可以采用示例中的方法。
您的 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
(免责声明:我是该包的作者)
除了 Anthon 的回答之外,您还可以通过以下方式使用 PyYaml 完成此操作:
mapping:
c_id:
!!python/tuple [pak, gb]: '4711'
!!python/tuple [pak, ch]: '4712'
!!python/tuple [pak]: '4713'
诀窍是告诉 PyYaml 您想要将键加载到元组中(因为列表不能用作字典键)。没有办法隐式,但这并不意味着不可能。
在这种情况下,显式键可能更具可读性:
mapping:
c_id:
? !!python/tuple [pak, gb]
: '4711'
? !!python/tuple [pak, ch]
: '4712'
? !!python/tuple [pak]
: '4713'
这个例子在语义上等同于第一个。
我需要一个元素列表作为键,这样我就可以检查是否满足几个条件。 示例(不知道这是否可行以及语法是否正确):
mapping:
c_id:
[pak, gb]: '4711'
[pak, ch]: '4712'
[pak]: '4713'
d_id:
.
.
.
现在我需要知道是否可以采用示例中的方法。
您的 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
(免责声明:我是该包的作者)
除了 Anthon 的回答之外,您还可以通过以下方式使用 PyYaml 完成此操作:
mapping:
c_id:
!!python/tuple [pak, gb]: '4711'
!!python/tuple [pak, ch]: '4712'
!!python/tuple [pak]: '4713'
诀窍是告诉 PyYaml 您想要将键加载到元组中(因为列表不能用作字典键)。没有办法隐式,但这并不意味着不可能。
在这种情况下,显式键可能更具可读性:
mapping:
c_id:
? !!python/tuple [pak, gb]
: '4711'
? !!python/tuple [pak, ch]
: '4712'
? !!python/tuple [pak]
: '4713'
这个例子在语义上等同于第一个。