Python脚本调用API时如何高效处理KeyError异常?
嗨,这个问题我之前也踩过坑,完全没必要给每个字段都单独写try-except块,分享几个更优雅的解决方案给你:
方案1:使用字典的get()方法(无额外依赖,推荐)
Python字典自带的get()方法可以指定键不存在时的默认值,配合对列表的判断,就能安全处理嵌套字段的缺失:
# 处理address:先获取addresses列表(默认空列表),若列表非空则取第一个元素,再取ip(默认空字符串) address = asset.get('addresses', [])[0].get('ip', '') if asset.get('addresses') else '' # 更简洁的写法,用or处理空列表的情况 address = (asset.get('addresses') or [{}])[0].get('ip', '') # 同理处理hostname hostname = (asset.get('hostNames') or [{}])[0].get('name', '') # 处理os字段,直接用get指定默认值 os = asset.get('os', '')
这种方式不需要try-except,直接通过默认值覆盖缺失字段的情况,代码更紧凑。
方案2:编写通用嵌套取值函数(适合复杂多层场景)
如果你的JSON结构嵌套很深,写一堆get()会显得繁琐,可以封装一个通用函数来处理多层嵌套的取值:
def get_nested_value(data, keys, default=''): current = data for key in keys: # 如果当前是列表,先取第一个元素(空列表则用空字典) if isinstance(current, list): current = current[0] if current else {} # 尝试获取当前键,取不到就返回默认值 current = current.get(key, default) # 如果已经拿到默认值,提前退出循环 if current == default: break return current # 使用示例:传参为数据对象和键的路径列表 address = get_nested_value(asset, ['addresses', 'ip']) hostname = get_nested_value(asset, ['hostNames', 'name']) os = get_nested_value(asset, ['os'])
这个函数可以轻松处理任意深度的嵌套结构,后续新增字段时直接调用函数即可,维护起来更方便。
方案3:使用第三方库简化属性访问(最简洁)
如果可以引入第三方库,推荐使用python-box,它能让你像访问对象属性一样操作字典,并且自动处理缺失的键:
首先安装库:
pip install python-box
然后使用:
from box import Box # 将普通字典转为Box对象,default_box=True表示缺失的属性返回空Box(避免报错) asset_box = Box(asset, default_box=True) # 直接用属性访问,缺失时返回None,再用or转为空字符串 address = asset_box.addresses[0].ip or '' hostname = asset_box.hostNames[0].name or '' os = asset_box.os or ''
这种写法最简洁,代码可读性也最高,适合长期维护的项目。
内容的提问来源于stack exchange,提问作者ExploiterZ
相关产品推荐
相关产品推荐

