如何以Pythonic方式简化嵌套字典的重复长路径访问?
问题描述
我定义了两个Python字典:
d1 = {"parent1": {"get": {"responses": {200: {"content": {"application/json": {}}}}}}} d2 = {"parent2": {"get": {"responses": {200: {"content": {"application/json": {}}}}}}}
为避免代码重复,我提取了公共结构复用:
common = {"get": {"responses": {200: {"content": {"application/json": {}}}}}} d1 = {"parent1": common} d2 = {"parent2": common}
但访问深层嵌套值时,每次都要写冗长的键路径:
v1 = d1["parent1"]["get"]["responses"][200]["content"]["application/json"] v2 = d2["parent2"]["get"]["responses"][200]["content"]["application/json"]
想找符合Pythonic风格的方法,消除这种重复的长键路径。
解决方案
1. 封装通用取值函数
把深层取值逻辑打包成函数,用reduce遍历键路径,一次性搞定:
from functools import reduce import operator def get_nested(data, keys): return reduce(operator.getitem, keys, data) # 把重复的键路径存成元组 nested_keys = ("get", "responses", 200, "content", "application/json") # 调用函数取值 v1 = get_nested(d1["parent1"], nested_keys) v2 = get_nested(d2["parent2"], nested_keys)
如果连顶层的parent1/parent2也想统一处理,直接把它们加到键路径里:
def get_value(data, parent_key): full_keys = (parent_key, "get", "responses", 200, "content", "application/json") return reduce(operator.getitem, full_keys, data) v1 = get_value(d1, "parent1") v2 = get_value(d2, "parent2")
2. 转成可属性访问的对象
用标准库的SimpleNamespace把字典转成可以用.访问的对象,减少下标符号:
from types import SimpleNamespace def dict_to_obj(d): if isinstance(d, dict): return SimpleNamespace(**{k: dict_to_obj(v) for k, v in d.items()}) return d # 转换字典 obj_d1 = dict_to_obj(d1) obj_d2 = dict_to_obj(d2) # 访问值(注意带/的键还是要用下标) v1 = obj_d1.parent1.get.responses[200].content["application/json"] v2 = obj_d2.parent2.get.responses[200].content["application/json"]
3. 预定义键路径循环取值
如果不想引入额外函数,直接存键路径元组,用循环遍历:
path = ("get", "responses", 200, "content", "application/json") v1 = d1["parent1"] for key in path: v1 = v1[key] v2 = d2["parent2"] for key in path: v2 = v2[key]
这种方式可读性强,不需要依赖额外库,适合简单场景。
内容的提问来源于stack exchange,提问作者renatodamas
相关产品推荐
相关产品推荐

