用递归函数按路径取值:将路径转为键列表,逐层调用 get() 并检查类型;遇列表则校验整数索引有效性;对 None、非字典/列表值或越界索引返回默认值而非报错。

怎么用递归函数在嵌套字典里按路径取值
直接给结论:用递归遍历字典,把路径拆成键序列,逐层 get() 或下标访问即可。关键不是“能不能写出来”,而是如何让函数对缺失键、非字典值、混合结构(含列表)有合理行为。
常见错误现象:KeyError 突然爆出来;遇到列表就报 TypeError: unhashable type: 'list';路径中间某个键存在但值是 None,结果误判为“没找到”。
- 路径建议统一用
list表示(如['a', 'b', 0, 'name']),比字符串分割更可靠(避免键名含点或斜杠) - 不要在递归里直接用
d[key],优先用d.get(key),并检查返回值是否为字典或列表 - 遇到列表时,只对整数索引做访问,且需先判断索引是否在范围内(
0 ) - 加一个
default参数,当路径中断时直接返回它,而不是抛异常
示例函数骨架:
eval()
-
eval()要求路径完全合法、数据结构完全符合预期,现实中的 JSON 响应常有字段缺失或类型错乱 - 无法统一控制缺失时的行为(返回
None?抛自定义异常?返回默认值?) - 调试困难——出错位置在拼出来的字符串里,不是原始代码行
遇到列表嵌套字典时怎么安全索引
这是最容易翻车的场景。路径像 ['data', 0, 'items', 2, 'id'],其中 0 和 2 是列表索引,必须确认它们对应的位置确实存在,且值是可继续查的类型。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
不能假设“只要路径里是整数,当前层级就一定是列表”。比如 {'0': 'string'} 也是合法字典,键叫 '0',不是索引。
- 只在明确当前值是
list类型时,才把路径头当作整数索引处理 - 索引必须是
int类型(不是字符串'0'),且范围有效 - 如果路径头是字符串,但当前值是列表,说明该层不支持键访问——直接返回
default - 建议在函数开头加类型检查:
if not isinstance(d, (dict, list)):就停递归
性能和兼容性要注意什么
纯递归在超深嵌套(>100 层)下可能触发 RecursionError,但真实业务数据极少超过 10 层。更值得关心的是:是否要支持 collections.abc.Mapping 这类抽象类型(比如 ChainMap),以及是否要兼容 None 作为中间节点。
- 如果需要支持任意映射类型,把
isinstance(d, dict)改成hasattr(d, '__getitem__')不够严谨,建议用isinstance(d, collections.abc.Mapping) - 对
None的处理要显式:比如if d is None: return default,否则None.get(...)会报错 - Python 3.9+ 可用
typing.Union标注参数类型,但运行时不校验,仅辅助 IDE
最常被忽略的一点:路径里的键可能是 int,也可能是 str,而字典只认 str 做键,列表只认 int 做索引——这个类型语义必须由调用方保证,函数内部只做防御性检查,不自动转换。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










