Python拆分字典IP端口字段时触发KeyError报错问题排查
报错原因
你遇到的KeyError本质是代码逻辑存在缺陷导致的:
- 代码强制读取字典的
source和destination键,没有做键存在性校验:当你单独测试某一个字段的处理逻辑时,传入的测试字典缺少另一个键,代码走到强制取值的行时就会直接抛出键不存在的错误。 - 代码直接在传入的原字典上做删除操作,就算测试字典两个键都存在,如果函数被重复调用,第一次调用已经删掉了旧键,第二次调用也会触发KeyError。
另外原代码还有两个不符合预期的问题:
- 第一行变量名
log entry带空格,属于Python语法错误,合法变量名不能包含空格,应该写成log_entry - 拆分出来的端口是字符串格式,和你要求的整数类型端口不匹配。
正确实现代码
log_entry = {'source': '192.168.4.1:80', 'destination': '168.20.10.1:443'} def split_ip_port(log_entry): # 拷贝原字典避免修改原始输入,不需要保留原数据可去掉copy直接操作入参 res = log_entry.copy() # 处理源IP端口 if 'source' in res: src_ip, src_port = res['source'].split(':', 1) res['src_ip'] = src_ip res['src_port'] = int(src_port) del res['source'] # 处理目的IP端口 if 'destination' in res: dest_ip, dest_port = res['destination'].split(':', 1) res['dest_ip'] = dest_ip res['dest_port'] = int(dest_port) del res['destination'] return res # 全字段测试 print(split_ip_port(log_entry)) # 输出: {'src_ip': '192.168.4.1', 'src_port': 80, 'dest_ip': '168.20.10.1', 'dest_port': 443} # 单独测试source字段场景 print(split_ip_port({'source': '192.168.1.10:8000'})) # 输出: {'src_ip': '192.168.1.10', 'src_port': 8000} # 单独测试destination字段场景 print(split_ip_port({'destination': '10.0.0.5:22'})) # 输出: {'dest_ip': '10.0.0.5', 'dest_port': 22}
优化点说明
- 所有键读取前先做存在性判断,缺键场景不会抛出KeyError
- 字符串拆分用
split(':', 1)限制只拆分一次,后续兼容IPv6格式的地址(多冒号场景)不会拆分出错 - 端口自动转成整数类型,完全匹配你要求的输出格式
- 基于字典拷贝做修改,不会污染原始传入的字典数据,重复调用也不会报错
内容的提问来源于stack exchange,提问作者blaker1327
相关产品推荐
相关产品推荐

