You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:06:19