Python脚本跨方法传递数据后YAML键值匹配错误,如何保留键值顺序?
- 场景:Python的
AppTool类中,extract_information静态方法可正确提取网络测试数据,提取结果如下:
Extracted Information - local_ip 10.122.1.159
Extracted Information - host_ip 10.122.1.150
Extracted Information - interval 0.00-5.02
Extracted Information - transfer 10.8 GBytes
Extracted Information - bandwidth 18.4 Gbits/sec
- 异常:调用
create_config_map_manifest静态方法将数据转为YAML格式ConfigMap时,键值完全错位,且bandwidth值为null,输出如下:
ConfigMap Data: bandwidth: null
host_IP: 0.00-5.02
interval: 10.8 GBytes
local_IP: 10.122.1.150
transfer: 18.4 Gbits/sec
- 需求:修复键值匹配错误,同时保留YAML键值的原有顺序。
- 键名格式不匹配:提取阶段使用小写下划线命名(
local_ip、host_ip),但ConfigMap输出使用大写驼峰格式(local_IP、host_IP),导致属性映射失败。 - 赋值顺序错位:
create_config_map_manifest方法构建键值对时,未按提取数据的顺序一一对应,出现值的错位赋值。 - bandwidth值丢失:因键名不匹配或赋值遗漏,导致无法读取到
bandwidth的正确值。
1. 统一键名格式
确保提取后的实例属性键名与ConfigMap输出的键名完全一致,示例:
# 提取时将数据存入格式匹配的实例属性 self.local_ip = extracted_local_ip # 若输出需要local_IP则改为self.local_IP self.host_ip = extracted_host_ip self.interval = extracted_interval self.transfer = extracted_transfer self.bandwidth = extracted_bandwidth
2. 按顺序构建有序结构
为保留YAML键值顺序,使用collections.OrderedDict(Python3.7+普通字典也保留插入顺序,明确使用更稳妥),严格按需求顺序添加键值对:
from collections import OrderedDict import yaml @staticmethod def create_config_map_manifest(app_tool_instance): # 按指定顺序构建有序字典,键名需与实例属性一致 config_data = OrderedDict([ ('local_ip', app_tool_instance.local_ip), ('host_ip', app_tool_instance.host_ip), ('interval', app_tool_instance.interval), ('transfer', app_tool_instance.transfer), ('bandwidth', app_tool_instance.bandwidth) ]) # 若输出需要大写驼峰键名,修改OrderedDict中的键即可,比如('local_IP', ...) return yaml.dump(config_data, default_flow_style=False)
3. 校验赋值逻辑
检查create_config_map_manifest方法中每个键对应的实例属性,确保无错位赋值情况,比如避免将interval的值赋给host_ip。
4. 验证修复结果
修复后重新运行,确认输出的ConfigMap数据符合预期:
ConfigMap Data: local_ip: 10.122.1.159
host_ip: 10.122.1.150
interval: 0.00-5.02
transfer: 10.8 GBytes
bandwidth: 18.4 Gbits/sec
内容的提问来源于stack exchange,提问作者DevOps__1903

