You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何实现可复用的嵌套字典键层级访问(类切片功能)

实现可复用的嵌套字典键路径访问(类似slice对象)

你需要一个可复用的对象来简化嵌套字典的多层索引操作,避免重复编写output['track']['urlparams']['trackartist']这类代码,遵循DRY原则。以下是几种实现方案:

方案一:调用式访问器(无需修改字典类型)

这种方案无需自定义字典,通过创建路径解析对象,调用它来获取对应值:

from functools import reduce
import operator

class DictKeySlice:
    def __init__(self, path_str):
        # 解析类似"['track']['urlparams']['trackartist']"的路径字符串
        self.keys = [key.strip("'[]") for key in path_str.split("][")]
    
    def __call__(self, data):
        # 逐层遍历键路径获取值
        return reduce(operator.getitem, self.keys, data)

# 使用示例
output = {
    'track': {
        'urlparams': {
            'trackartist': 'artist_name'
        }
    }
}

key = DictKeySlice("['track']['urlparams']['trackartist']")
print(key(output))  # 输出: artist_name

方案二:支持output[key]语法的自定义字典

如果坚持要和slice对象完全一致的索引语法,可以继承dict并重写__getitem__方法:

from functools import reduce
import operator

class PathAccessibleDict(dict):
    class DictKeySlice:
        def __init__(self, path_str):
            self.keys = [key.strip("'[]") for key in path_str.split("][")]
    
    def __getitem__(self, item):
        if isinstance(item, self.DictKeySlice):
            return reduce(operator.getitem, item.keys, self)
        return super().__getitem__(item)

# 使用示例
output = PathAccessibleDict({
    'track': {
        'urlparams': {
            'trackartist': 'artist_name'
        }
    }
})

key = output.DictKeySlice("['track']['urlparams']['trackartist']")
print(output[key])  # 输出: artist_name

优化:支持点分隔路径

可以扩展解析逻辑,同时支持更简洁的点分隔路径(如track.urlparams.trackartist):

from functools import reduce
import operator

class DictKeySlice:
    def __init__(self, path_str):
        if "][" in path_str:
            # 处理方括号格式
            self.keys = [key.strip("'[]") for key in path_str.split("][")]
        else:
            # 处理点分隔格式
            self.keys = path_str.split(".")
    
    def __call__(self, data):
        try:
            return reduce(operator.getitem, self.keys, data)
        except (KeyError, TypeError):
            return None  # 可根据需求改为抛出异常

# 使用示例
output = {
    'track': {
        'urlparams': {
            'trackartist': 'artist_name'
        }
    }
}

key1 = DictKeySlice("['track']['urlparams']['trackartist']")
key2 = DictKeySlice("track.urlparams.trackartist")
print(key1(output))  # 输出: artist_name
print(key2(output))  # 输出: artist_name

核心原理是利用functools.reduce递归调用operator.getitem,将多层索引操作转化为依次获取每一层的值,实现路径的复用。

内容的提问来源于stack exchange,提问作者Kayaba_akihiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:20:18