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

Python自定义RangeDict如何同时支持range键和字符串键访问

RangeDict递归报错原因及修复方案

报错根因

当你传入字符串类型键查询时,原代码的逻辑会进入「非range类型遍历所有键匹配」的分支:如果字典中存在和查询字符串完全相等的字符串键,item in key的判断会返回True,之后调用self[key]会再次触发__getitem__查询同一个字符串键,形成无限递归,最终触发递归深度超限错误。

修复思路

调整查询逻辑的优先级:

  1. 优先匹配完全相等的现有键,覆盖字符串、range、整数等所有类型的直接键查询
  2. 仅当查询值是整数且没有直接匹配的键时,再遍历所有range类型的键做区间匹配
  3. 所有匹配失败后抛出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:09:01