Python自定义RangeDict如何同时支持range键和字符串键访问
RangeDict递归报错原因及修复方案
报错根因
当你传入字符串类型键查询时,原代码的逻辑会进入「非range类型遍历所有键匹配」的分支:如果字典中存在和查询字符串完全相等的字符串键,item in key的判断会返回True,之后调用self[key]会再次触发__getitem__查询同一个字符串键,形成无限递归,最终触发递归深度超限错误。
修复思路
调整查询逻辑的优先级:
- 优先匹配完全相等的现有键,覆盖字符串、range、整数等所有类型的直接键查询
- 仅当查询值是整数且没有直接匹配的键时,再遍历所有range类型的键做区间匹配
- 所有匹配失败后抛出KeyError
修复后代码
class RangeDict(dict): def __getitem__(self, item): # 优先匹配完全相等的键,支持所有类型的直接查询 if item in self: return super().__getitem__(item) # 仅整数类型走range区间匹配逻辑 if isinstance(item, int): for key in self: if isinstance(key, range) and item in key: return self[key] raise KeyError(item)
功能验证
# 同时包含range键和字符串键的实例 check = RangeDict({ range(10, 100): 40, range(110, 115): 40, range(118, 121): 50, range(130, 131): 50, range(140, 141): 30, "a100": 110, "c120": 100 }) print(check[20]) # 输出 40,整数区间匹配正常 print(check["a100"]) # 输出 110,字符串键查询正常 print(check[130]) # 输出 50,单值range匹配正常 print(check[range(10,100)]) # 输出40,range类型键查询和原有逻辑一致
内容的提问来源于stack exchange,提问作者lunbox
相关产品推荐
相关产品推荐

