如何在YAML文件中正确配置包含tuple的字典数据结构
解决方案
YAML 原生没有对应 Python tuple 的数据类型,你可以选以下两种方案实现配置写入:
方案1:通用无依赖方案(推荐)
先把 Python 字典中所有 tuple 转为 list 后写入 YAML,加载配置后再按业务规则把对应位置的 list 转回 tuple 即可,兼容性最好,不需要依赖YAML解析库的特殊配置。
转换后的标准YAML配置如下:
pdu_cfg_new: stream: - - Ether - src: "00:50:56:ab:d5:ad" dst: "00:50:56:ab:a2:e3" - - IP - src: "192.168.1.2" dst: "10.1.12.1" - - GRE - key: '48999' - - Ether - src: "00:50:56:ab:d5:ad" dst: "00:50:56:ab:a2:e3" - - IP - src: "20.20.1.2" dst: "10.1.10.1" - - TCP - {} vm: - name: ip_ttl min_value: 1 max_value: 125 size: 1 op: inc offset: IP.ttl - name: tcp_dport min_value: 1024 max_value: 1200 size: 2 op: inc offset: TCP.dport
加载配置后,只需要遍历pdu_cfg_new['stream']下的每一个子列表,用tuple()方法转换即可得到和原来完全一致的结构。
方案2:PyYAML 自定义类型方案(仅Python环境使用)
如果你只用Python读写这个YAML文件,可以给PyYAML注册tuple的序列化/反序列化规则,不需要手动转换结构:
- 写入时注册tuple表示器:
import yaml from yaml import Dumper def tuple_representer(dumper, data): return dumper.represent_sequence('!tuple', data) Dumper.add_representer(tuple, tuple_representer) # 直接写入原字典即可,不需要提前转换tuple with open('config.yaml', 'w') as f: yaml.dump(your_original_dict, f, Dumper=Dumper)
- 读取时注册tuple构造器:
from yaml import Loader, SafeLoader def tuple_constructor(loader, node): return tuple(loader.construct_sequence(node)) Loader.add_constructor('!tuple', tuple_constructor) SafeLoader.add_constructor('!tuple', tuple_constructor) # 读取后直接得到带tuple的原结构 with open('config.yaml', 'r') as f: cfg = yaml.load(f, Loader=Loader)
内容的提问来源于stack exchange,提问作者naresh moorthy
相关产品推荐
相关产品推荐

