
本文介绍一种简洁、通用的方法,使用元组作为键路径来递归访问任意深度的嵌套字典,避免手动链式索引,并支持错误处理与可扩展性。
本文介绍一种简洁、通用的方法,使用元组作为键路径来递归访问任意深度的嵌套字典,避免手动链式索引,并支持错误处理与可扩展性。
在 Python 中,直接用元组(如 my_dict[("1", "b")])访问嵌套字典会触发 KeyError 或 TypeError,因为字典不支持元组解包式索引——它只接受单个键,而非路径序列。为实现“元组即路径”的语义,我们需要一个辅助函数,将元组中的每个元素依次作为键,逐层向下取值。
最简洁且函数式风格的实现是借助 functools.reduce:
from functools import reduce
def nested_get(dictionary, keys):
"""
通过键元组安全获取嵌套字典中的值。
Args:
dictionary (dict): 待查询的嵌套字典
keys (tuple): 键路径,如 ("2", "a", "i")
Returns:
任意类型: 对应路径的值
Raises:
KeyError: 路径中任一中间键不存在
TypeError: 中间某层非字典类型(如遇到字符串或 None 后继续索引)
"""
return reduce(lambda d, key: d[key], keys, dictionary)使用示例如下:
my_dict = {
"1": {"a": "hi", "b": "bye"},
"2": {"a": {"i": "howdy"}}
}
print(nested_get(my_dict, ("1", "b"))) # 输出: "bye"
print(nested_get(my_dict, ("2", "a", "i"))) # 输出: "howdy"✅ 优势说明:
- 一行核心逻辑,清晰表达“从字典出发,按序应用每个键”;
- 支持任意长度元组,无需硬编码层级;
- 类型安全:若路径中途出现非字典值(如 "a": 42),42["i"] 将自然抛出 TypeError,便于快速定位数据结构问题。
⚠️ 注意事项:
- 该函数默认不处理缺失键;如需容错(例如返回 None 或默认值),可增强为:
from functools import reduce def nested_get(dictionary, keys, default=None): try: return reduce(lambda d, k: d[k], keys, dictionary) except (KeyError, TypeError, AttributeError): return default - 避免对不可变对象(如 str, int, None)调用 [] 操作,确保嵌套结构符合预期(每层均为 dict 或映射类型)。
总结:nested_get 是一个轻量、可复用的工具函数,将元组转化为字典访问路径,显著提升处理配置、API 响应、JSON 数据等嵌套结构时的代码可读性与健壮性。建议将其封装进项目通用工具模块中,配合类型提示(如 def nested_get(d: dict, keys: tuple[str, ...]) -> Any:)进一步强化工程实践。

















