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
相关产品推荐
相关产品推荐

