应使用链式 dict.get(key, default) 代替嵌套下标访问,因后者遇任意键缺失或非字典值即抛 KeyError/TypeError;每层需按后续操作选 {} 或 [] 作默认值以避免类型错误。

直接用 dict.get() 链式调用,但必须每层都加 .get(),不能只在最外层用一次。
为什么 data["a"]["b"]["c"] 容易报 KeyError
因为只要中间任意一层键缺失(比如 "a" 不存在,或 "a" 存在但值不是字典、或 "b" 不存在),整个表达式就立刻崩溃。它不“跳过”错误,而是精确失败。
常见错误现象:KeyError: 'detail'、TypeError: 'NoneType' object is not subscriptable(说明上一层返回了 None,你还接着下标访问)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把每一级访问都换成
.get(key, default),且default通常设为{}(空字典)或[](空列表),避免下一层调用时报TypeError - 不要写
data.get("a").get("b").get("c")—— 如果data.get("a")返回None,后面两个.get()就会报AttributeError - 正确写法示例:
data.get("a", {}).get("b", {}).get("c")
get() 的默认值选 {} 还是 None?
取决于你后续是否还要继续取子键。如果还会链式访问下一级,必须用 {} 或 [];如果只是最终读一个叶子值,用 None 更清晰。
使用场景对比:
- 要取
goods_data[0]["detail"]["specs"][0]["color"]→ 改成goods_data[0].get("detail", {}).get("specs", [{}])[0].get("color") - 要取
user["profile"]["email"]且不再往下钻 →user.get("profile", {}).get("email")即可,末尾不强制给默认字典 - 若不确定
"specs"是列表还是None,先用.get("specs", [])再索引,避免TypeError
更复杂的嵌套:用递归函数还是第三方库?
当嵌套层级不固定、路径动态生成(比如从配置里读 key path 字符串 "detail.seller.name"),手写多层 .get() 就容易漏、难维护。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 简单场景(≤3 层、结构基本稳定):坚持链式
.get(),零依赖、逻辑直白 - 中等复杂(路径字符串、需容错遍历):自己写个安全取值函数,例如
safe_get(data, "detail.seller.name", default="N/A") - 重度嵌套(API 响应解析、大量 JSON 处理):考虑
dictor库(pip install dictor),支持点号路径和默认值,如dictor(data, "detail.seller.name", default="—") - 别用
eval()或exec()拼接字符串路径——太危险,也难 debug
最容易被忽略的一点:.get() 只防 KeyError,不防 TypeError。一旦某层返回了 None 或字符串这类非容器类型,后续的 .get() 或 [0] 就会立刻报错。所以每层“兜底”时,类型要匹配下一步操作——要取子键就兜底成 {},要索引就兜底成 []。


















